我环顾四周,但没有看到关于这个问题的任何信息,所以我想在这里问一问:
每当我尝试在启动一个随机线程之后运行一个subprocess.Popen调用,我就会得到一个OSError。我的假设是,subprocess.py有一些与多线程有关的方面,我不理解。
我正在QNX系统上运行python2.7.3。
代码测试:
import subprocess
import time
from threading import Thread
def Test():
while(1):
print "Testing."
time.sleep(1)
if __name__=="__main__":
subprocess.Popen('ls') # runs just fine
Thread(target=Test).start()
subprocess.Popen('ls') # throws OSError
回溯
Traceback (most recent call last):
File "test.py", line 16 in <module>
subprocess.Popen('ls')
File "usr/local/lib/python2.7/subprocess.py", line 679, in __init__
errread, errwrite)
File "usr/local/lib/python2.7/subprocess.py", line 1143, in _execute_child
self.pid = os.fork()
OSError: [Errno 89] Function not implemented
发布于 2021-09-01 21:00:40
QNX的设计并不是为了在进程已经生成新线程之后在进程中支持fork()
。从QNX文档..。
假设您有一个进程,但还没有创建任何线程(也就是说,您正在使用一个线程运行,即调用main()的线程)。当您调用fork()时,将创建另一个进程,也使用一个线程。这是一个简单的例子。 现在假设在您的过程中,您已经调用了pthread_create()来创建另一个线程。当您调用fork()时,它现在将返回ENOSYS (这意味着不支持该函数)!为什么? 好吧,信不信由你,这是与POSIX兼容的- POSIX说fork()可以返回ENOSYS。实际发生的情况是:中微子C库目前并不是用来处理线程进程分叉的。当调用pthread_create()时,函数设置一个标志,有效地说:“不要让这个Process叉(),因为我还没有准备好处理它。”然后,在库fork()函数中,检查此标志,如果设置,将使fork()返回ENOSYS。
(来源,请阅读Process creation and threads
部分。)
我假设Thread(target=Test).start()
调用pthread_create()
并解释您所看到的错误。
还值得注意的是,ENOSYS
的定义还指定了未实现的函数。见以下定义..。
ENOSYS Function not implemented (POSIX.1-2001).
(来源)
因此,这是一个OS级别的约束。Python没有问题!
https://stackoverflow.com/questions/69019890
复制相似问题