我正在运行长时间运行的dask.delayed()作业(使用子进程来运行外部二进制文件来处理大型文件),并且由于所有工作人员都失去了他们的调度程序通信而取消了Futures:
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代码......
正如警告所提到的那样,工人的主要线程暂时无法做任何事情。这通常是由调用保存在GIL上的编译函数引起的。他们抓住GIL然后消失在已编译的代码中一段时间,而不是让任何其他Python代码(如心跳消息)运行。
解决此问题的正确方法是让已编译的代码释放GIL。如果您可以控制这段代码,那么它通常是Cython中的一个简单修复,现在,我认为,默认是在cffi中。如果你只是打电话给subprocess
那么我对此没有一个很好的解释。这不应该坚持GIL。