在多线程脚本中使用subprocess.run()是一个bug吗?

问题描述 投票:0回答:1

我有一个很长的构建脚本,它混合了“真正的”Python代码和冗长的

subprocess.run()
调用,例如
debootstrap
wget
apt-get
build.sh

一切都是并行的。一个线程执行

debootstrap
,然后执行
apt-get
,而另一个线程执行
build.sh
,然后将两者连接起来,我们启动更多线程来组合结果,依此类推。每个线程都会记录到一个专用文件中。

在寻找一种通用方法来记录由这些线程之一启动的

subprocess.run()
的输出时,我得到了以下答案:https://stackoverflow.com/a/31868783/876832

在具有多个线程的Python脚本中调用

subprocess.run()
是一个错误吗?

python multithreading
1个回答
4
投票

在具有多个线程的Python脚本中调用

subprocess.run()
是一个错误吗?

不。我一直这样做。

我认为您链接的答案是误导的。毕竟,您甚至不知道

subprocess.Popen()
及其外观(如
subprocess.run()
)是否使用
fork
系统调用(特别是在 Windows 上,它们当然不知道,因为那里不存在该调用)。

当然,如果你要手动

os.fork()
,我会在线程程序中谨慎行事(事实上,正如文档所说,从 3.12 开始,如果 Python 检测到你正在这样做,它会警告你) .

但是,在 POSIX 系统上,

subprocess.Popen()
尽可能使用
os.posix_spawn
,否则非常仔细的
fork_exec
实现

哦,顺便说一句,您链接的问题实际上使用了Python 2.7时代的低级

thread
模块,现在恰当地称为
_thread
,低级线程API
。那是与
threading.Thread
s不同的低级野兽。

© www.soinside.com 2019 - 2024. All rights reserved.