阻塞和非阻塞子流程调用

阻塞和非阻塞子流程调用,第1张

阻塞和非阻塞子流程调用

Popen
是非阻塞的。
call
并且
check_call
正在封锁。您可以
Popen
通过调用其实例
wait
communicate
方法来制作实例块。

如果您查看源代码,则会看到

call
calls
Popen(...).wait()
,这就是它被阻止的原因。
check_call
call
call
,这也是它也会阻止的原因。

严格来说,

shell=True
与阻塞问题正交。但是,这
shell=True
会导致Python执行shell,然后在shell中运行命令。如果使用阻塞调用,则该调用将在
外壳程序 完成时返回。由于外壳程序可能会生成一个子进程来运行命令,因此外壳程序可能会在生成的子进程之前完成。例如,

import subprocessimport timeproc = subprocess.Popen('ls -lRa /', shell=True)time.sleep(3)proc.terminate()proc.wait()

这里生成了两个进程:Popen生成了一个运行Shell的子进程。外壳反过来产生一个正在运行的子进程

ls

proc.terminate()
杀死外壳程序,但子进程
ls
仍在运行。(这是由丰富的输出表现,在python脚本结束后还是一样。准备杀
ls
pkillls
。)



欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5666252.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存