Python的子进程popen中的死锁
问题描述:
我遇到了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和博托