Несколько вызовов rs.exe
У меня есть утилита генерации отчетов на основе Python SSRS, которую я использую для создания нескольких отчетов (часто более 100). Способ его настройки -
- Несколько потоков вызываются с помощью threading.Thread, и каждому из них присваивается словарь.
- Каждый поток анализирует словарь и вызывает rs.exe, передавая соответствующие аргументы через подпроцесс python.
Отчеты генерируются со следующими предостережениями -
- При наличии около 20-30 отчетов все работает без особых проблем.
- Если число отчетов превышает 40-50+ (по неизвестным мне причинам), некоторые из отчетов не обрабатываются и возвращаются с ошибкой, полученной в ненулевом состоянии subprocess.call (сообщение об ошибке из подпроцесса.call не указывает на какую-либо реальную ошибку). Но в этих командах rs.exe нет ошибок, так как они отображаются при запуске из командной строки Windows.
- Кроме того, когда я пытаюсь перезапустить все эти неудачные отчеты, они оказываются. Там нет изменений в командах или данных, пока они перезапускаются.
Чтобы обойти это, я использовал логику повторения для двух итераций, которая, кажется, иногда решала проблему. Однако, когда отчеты превышают 100/150+, даже повторная попытка не работает. Теперь я мог бы расширить логику повторных попыток, чтобы повторять попытки до тех пор, пока все отчеты не будут отрисованы, а любые ошибки будут подлинными (например, RDL не найден, поврежден и т. Д.). Но прежде чем я сделаю что-то подобное, хочу узнать, есть ли какие-либо ограничения на количество одновременно запускаемых rs.exe или есть ли какие-либо ограничения на subproces.call в python при вызове в многопоточном контексте.
Может кто-нибудь поделиться своими знаниями, если они столкнулись с такой проблемой и решили ее?
Благодарю.
1 ответ
Я подозреваю, что установленный вами предел - не сам rs.exe, а целевой сервер отчетов. При этом будет использовано столько физической памяти, сколько доступно, но при ее исчерпании дальнейшие запросы начнут давать сбой. Это описано в документе SSRS:
https://msdn.microsoft.com/en-us/library/ms159206.aspx
Чтобы избежать этой проблемы и оставить некоторые ресурсы сервера для других пользователей, я бы уменьшил ваш предел потока как можно ниже - в идеале - до 1.