2024-09-28 21:08:08 发布
网友
我有一个Python守护进程在生产中运行。它使用7到120个线程。最近,最小的实例(7个线程)开始显示挂起,而所有其他实例从未显示此类问题。将strace附加到python进程表明,所有线程都在调用futex futex_WAIT_PRIVATE,因此它们可能试图锁定某些内容。
你将如何调试这样的问题?
请注意,这是一个从闪存运行的生产系统,因此磁盘写入也受到限制。
观察结果有点不正确。一个线程没有调用futex,而是在保持gil的同时交换。由于所讨论的机器是低硬件,这个交换花了很长时间,似乎是一个死锁。根本的问题是内存泄漏。:-()
亲爱的赫尔穆特,我也有同样的问题,一根线挂在未来的等等。
看来你已经解决了这个问题。你能分享更多关于解决方案的信息吗?
升级版:
锁的原因终于找到了(至少在我的例子中是这样):这是由于Python中的导入锁。
考虑以下情况:
文件1.py:
import file2
文件2.py:
create thread "thread2"run "thread2"wait until "thread2" finish with some function (let's say go Go())def Go():import some_module....
create thread "thread2"
run "thread2"
wait until "thread2" finish with some function (let's say go Go())
def Go():
import some_module....
import some_module
....
在这里,Go()中的导入将挂起,因为导入被锁定在主线程(由导入文件2)中,在Go()完成之前不会释放主线程。用户将看到strace hang on FUTEX_WAIT_PRIVATE。
要解决此问题,请将在将file2导入Do()函数期间执行的代码放在此处,并在导入file2之后运行它:
import file2file2.Do()
file2.Do()
观察结果有点不正确。一个线程没有调用futex,而是在保持gil的同时交换。由于所讨论的机器是低硬件,这个交换花了很长时间,似乎是一个死锁。根本的问题是内存泄漏。:-()
亲爱的赫尔穆特,我也有同样的问题,一根线挂在未来的等等。
看来你已经解决了这个问题。你能分享更多关于解决方案的信息吗?
升级版:
锁的原因终于找到了(至少在我的例子中是这样):这是由于Python中的导入锁。
考虑以下情况:
文件1.py:
文件2.py:
在这里,Go()中的导入将挂起,因为导入被锁定在主线程(由导入文件2)中,在Go()完成之前不会释放主线程。用户将看到strace hang on FUTEX_WAIT_PRIVATE。
要解决此问题,请将在将file2导入Do()函数期间执行的代码放在此处,并在导入file2之后运行它:
相关问题 更多 >
编程相关推荐