【发布时间】:2020-05-03 06:08:55
【问题描述】:
如果 preexec_fn 设置为可调用对象,则该对象将在子进程执行之前在子进程中调用。 (仅限 POSIX)
那为什么执行preexec_fn函数时父进程挂起呢?如果它在子进程中执行,那么父进程应该能够继续。
这是一个程序的小例子,它创建了一个新的“ls”进程,在此之前它会休眠 4 秒。理想情况下,应立即打印“到达”,但事实并非如此。 4 秒后打印“到达”。
import os
import subprocess
import sys
import tempfile
import time
def sleep_a_little():
time.sleep(4)
p = subprocess.Popen(["ls"], preexec_fn=sleep_a_little)
print("reached")
【问题讨论】:
-
可能是this
-
嗯@Matt,它看起来不像,因为 Popen 不会永远挂起。链接的答案谈到了潜在的僵局。由于
preexec_fn需要 4 秒来执行,它挂起 4 秒。我的问题是父进程不应该等待 preexec_fn 执行,因为这发生在子进程中。 -
如果 preexec_fn 设置为可调用对象,则该对象将在子进程执行之前在子进程中调用。 (仅限 POSIX)。所以我认为应该先调用
sleep_a_little,然后再调用ls,不是吗? -
是的,会在ls之前调用。但它是在 fork 之后调用的。所以子进程调用它。为什么父进程(原名为
subprocess.Popen()的进程)在执行sleep_a_little时会挂在子进程上?
标签: python multiprocessing popen