Python的subprocesspopen死锁

我有一个问题,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看到,在那里我看到我的主进程有一个同名的subprocess。 杀死该进程会导致父级中卡住的线程恢复。

据我所知,subprocess(这将execvp)locking在创build和运行os.execvp之间的50行中的某个地方。 使问题复杂化,这是非常罕见的。 可能有100个popen。 这个locking怎么会发生? 我如何解决它? (我不能在一个简单的python程序中重现这种行为)。

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

技术说明:

  • 在Amazon EC2上运行
  • 在Ubuntu 11.10中的Linux 3.0.0-14-x86_64
  • python 2.7.2解释器。
  • 使用包括paramiko和博托几个库

看起来像是最近提交的python 2.7.2 bug:

http://bugs.python.org/issue13817