Python的子进程popen中的死锁

时间:2012-02-11 04:24:25

标签: linux popen python-2.7 subprocess

我遇到了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进程已经自行分叉,但它还没有运行os.execvp。通过检查ps可以看出这一点,我看到主进程的子进程具有相同的名称。杀死该进程会导致父进程中的卡住线程恢复。

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

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

技术说明:

  • 在Amazon EC2上运行
  • Linux 3.0.0-14-ubuntu 11.10中的虚拟x86_64
  • python 2.7.2 interpreter。
  • 使用包括paramiko和boto
  • 在内的多个库

1 个答案:

答案 0 :(得分:3)

看起来它是最近提交的python 2.7.2错误:

http://bugs.python.org/issue13817