我正在运行长期运行的dask.delayed()作业(该作业使用子进程运行外部二进制文件来处理大文件),并且由于所有工作人员失去调度程序通信而被取消了期货:
distributed.worker - WARNING - Heartbeat to scheduler failed
调度程序说:
distributed.core - INFO - Event loop was unresponsive in Scheduler for 3.99s.
This is often caused by long-running GIL-holding functions or moving large chunks of data.
This can cause timeouts and instability.
为什么会发生这种情况,以及如何解决/修复它?据我了解,调度程序本身不会运行任何python代码...
答案 0 :(得分:0)
正如警告所提到的,worker的主线程暂时无法执行任何操作。这通常是由调用保留在GIL上的已编译函数引起的。他们抓住了GIL,然后消失了一段时间,不再运行任何其他Python代码(如心跳消息)。
解决此问题的正确方法是让编译后的代码发布GIL。如果您可以控制此代码,则通常可以在Cython中轻松解决,现在,我认为现在是cffi中的默认设置。如果您只是打电话给subprocess
,那么我对此没有很好的解释。那不应该保留在GIL上。