阻塞和非阻塞子进程调用
- 2025-03-05 09:16:00
- admin 原创
- 90
问题描述:
我完全搞不清楚subprocess.call()
、、subprocess.Popen()
。subprocess.check_call()
哪一个是阻塞的,哪一个不是?
我的意思是如果我使用subprocess.Popen()
父进程是否等待子进程return
才exit
继续执行。
如何shell=True
影响这些呼叫?
解决方案 1:
Popen
是非阻塞的。call
和check_call
是阻塞的。 您可以Popen
通过调用其wait
或communicate
方法使实例阻塞。
如果您查看源代码,您会看到call
调用Popen(...).wait()
,这就是它阻塞的原因。 check_call
调用call
,这也是它阻塞的原因。
严格来说,shell=True
与阻塞问题正交。但是,shell=True
会导致 Python 执行 shell,然后在 shell 中运行命令。如果使用阻塞调用,则调用将在shell完成时返回。由于 shell 可能会生成子进程来运行命令,因此 shell 可能会在生成的子进程之前完成。例如,
import subprocess
import time
proc = subprocess.Popen('ls -lRa /', shell=True)
time.sleep(3)
proc.terminate()
proc.wait()
这里生成了两个进程:Popen 生成一个运行 shell 的子进程。shell 又生成一个运行 的子进程ls
。 proc.terminate()
终止 shell,但运行的子进程ls
仍然存在。(这表现为即使在 python 脚本结束后仍有大量输出。准备用 终止ls
。pkill ls
)
相关推荐
热门文章
项目管理软件有哪些?
热门标签
曾咪二维码
扫码咨询,免费领取项目管理大礼包!
云禅道AD