2012-02-11 121 views
9

我遇到了popen死锁的问题。具体而言,在运行POPEN线程(不是主线程)是停留在:Python的子进程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,我可以看到蟒蛇进程已经分叉本身,但它尚未运行os.execvp。这可以通过检查ps看到,我发现我的主进程有一个名字相同的子进程。杀死该进程会导致父级中卡住的线程恢复。

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

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

技术说明:

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

回答