Python挂在futex调用中

2024-09-28 21:08:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Python守护进程在生产中运行。它使用7到120个线程。最近,最小的实例(7个线程)开始显示挂起,而所有其他实例从未显示此类问题。将strace附加到python进程表明,所有线程都在调用futex futex_WAIT_PRIVATE,因此它们可能试图锁定某些内容。

你将如何调试这样的问题?

请注意,这是一个从闪存运行的生产系统,因此磁盘写入也受到限制。


Tags: 实例内容进程系统private线程磁盘wait
2条回答

观察结果有点不正确。一个线程没有调用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

....

在这里,Go()中的导入将挂起,因为导入被锁定在主线程(由导入文件2)中,在Go()完成之前不会释放主线程。用户将看到strace hang on FUTEX_WAIT_PRIVATE。

要解决此问题,请将在将file2导入Do()函数期间执行的代码放在此处,并在导入file2之后运行它:

import file2

file2.Do()

相关问题 更多 >