2015-12-08 23 views
1

我有一个基于python的SSRS报表生成工具,我正在使用它来生成多个报表(通常为100+)。它的设置方式是 -多个rs.exe调用

  1. 使用threading.Thread调用多个线程,并且每个线程都被赋予一个字典。
  2. 每个线程解析字典和电话rs.exe通过Python的subprocess.call

报告中出现以下注意事项产生的传递相关的参数 -

  1. 如果周围有20-30报告一切工作正常,没有太多问题。
  2. 如果报告的数量超过40-50 +(由于我目前未知的原因),某些报告不会被渲染并返回错误 ,如通过subprocess.call获得的非零状态(来自subprocess.call的错误消息不会指向任何真正的错误)。 但是这些rs.exe命令没有错误,因为它们在我从Windows命令提示符运行它们时显示。
  3. 此外,当我尝试重新运行所有这些失败的报告,他们得到渲染。命令或数据在重新运行时没有改变。

要解决这个问题,我采用了2次迭代的重试逻辑,似乎有时会解决这个问题。但是,当报告超出100/150 + 时,即使重试不起作用。现在,我可以扩展重试逻辑,以继续重试,直到所有报告都被呈现,并且发生任何故障 都是真正的故障(如未找到RDL,损坏等)。但在我做任何这样的事情之前,想知道是否有任何限制多少 rs.exe可以同时启动,或者如果在多线程上下文中调用python的subproces.call有任何限制。

有人可以分享他们的专业知识,如果他们遇到过这样的问题并解决它?

谢谢。

+0

如果碰巧同时发生的子进程调用数量有限制,也许可以使用[semaphore](https://docs.python.org/2/library/threading.html#semaphore-objects)来确保不超过20个线程可以同时执行“调用”。 – Kevin

+0

感谢您的建议。我改变了实现使用ThreadPoolExecutor与最多20个线程和它的工作,至少在第一次运行。没有错误,不必做任何重试。将做更多的测试用例来确保行为一致。 – Murali

回答

0

我怀疑你打的限制不是rs.exe本身,而是目标报表服务器。这将使用尽可能多的物理内存,但当它耗尽时,进一步的请求将开始失败。这是在SSRS DOCO描述:

https://msdn.microsoft.com/en-us/library/ms159206.aspx

为了避免这个问题,并留有一定的服务器资源,为其他用户,我会降低你的线程限为你受得了 - 理想为1