Python的子进程popen死锁

Posted

技术标签:

【中文标题】Python的子进程popen死锁【英文标题】:Deadlock in Python's subprocess popen 【发布时间】:2012-03-03 12:19:53 【问题描述】:

我遇到了 popen 死锁的问题。具体来说,运行popen的线程(不是主线程)卡在:

File: "/usr/lib/python2.7/subprocess.py", line 679, in __init__
  errread, errwrite)
File: "/usr/lib/python2.7/subprocess.py", line 1224, in _execute_child
  data = _eintr_retry_call(os.read, errpipe_read, 1048576)
File: "/usr/lib/python2.7/subprocess.py", line 478, in _eintr_retry_call
  return func(*args)

用ps可以看到python进程已经fork了自己,但是还没有运行os.execvp。这可以通过检查ps可以看出,在这里我看到我的主进程有一个同名的子进程。终止该进程会导致父进程中的卡住线程恢复。

据我所知,子进程(将执行 execvp)在其创建和运行 os.execvp 之间的 50 行中被锁定。使事情复杂化的情况很少见;可能每 100 个人中就有 1 个。这种锁定怎么会发生?我如何解决它? (我无法在一个简单的 python 程序中重现这种行为)。

我应该注意到,虽然这个程序是令人难以置信的多线程(数百个线程在运行),但没有其他线程分叉或使用 popen。不过,许多其他线程正在使用文件描述符(主要是套接字)。

技术说明:

在 Amazon EC2 上运行 ubuntu 11.10 中的 Linux 3.0.0-14-virtual x86_64 python 2.7.2 解释器。 使用多个库,包括 paramiko 和 boto

【问题讨论】:

【参考方案1】:

貌似是最近提交的python 2.7.2 bug:

http://bugs.python.org/issue13817

【讨论】:

以上是关于Python的子进程popen死锁的主要内容,如果未能解决你的问题,请参考以下文章

Python中的子进程是啥? [关闭]

正确关闭 Python 中的子进程 [重复]

python子进程模块subprocess详解与应用实例 之二

管道时在python的子进程模块中使用stdout.close()

Python从完成的子进程中获取环境

在python中控制用于调用外部命令的子进程数