首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >激活线程时python subprocess.Popen抛出错误

激活线程时python subprocess.Popen抛出错误
EN

Stack Overflow用户
提问于 2021-09-01 19:56:05
回答 1查看 192关注 0票数 1

我环顾四周,但没有看到关于这个问题的任何信息,所以我想在这里问一问:

每当我尝试在启动一个随机线程之后运行一个subprocess.Popen调用,我就会得到一个OSError。我的假设是,subprocess.py有一些与多线程有关的方面,我不理解。

我正在QNX系统上运行python2.7.3。

代码测试:

代码语言:javascript
运行
复制
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

回溯

代码语言:javascript
运行
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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的定义还指定了未实现的函数。见以下定义..。

代码语言:javascript
运行
复制
ENOSYS Function not implemented (POSIX.1-2001).

(来源)

因此,这是一个OS级别的约束。Python没有问题!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69019890

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档