阻塞和非阻塞子流程调用

发布于 2021-01-29 15:23:37

我之间是完全混淆subprocess.call()subprocess.Popen()subprocess.check_call()

哪个是阻塞的,哪个不是?

我的意思是说我subprocess.Popen()是否使用父进程是否等待子进程继续执行之前return/ exit

如何shell=True影响这些电话?

关注者
0
被浏览
93
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

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

    如果您查看源代码,则会看到callcalls
    Popen(...).wait(),这就是它被阻止的原因。 check_callcall call,这也是它也会阻止的原因。

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

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

    这里生成了两个进程:Popen生成了一个运行Shell的子进程。外壳反过来产生一个正在运行的子进程ls
    proc.terminate()杀死外壳程序,但子进程ls仍在运行。(这是由丰富的输出表现,在python脚本结束后还是一样。准备杀lspkill ls。)



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看