【发布时间】:2018-02-06 08:17:01
【问题描述】:
在制作 WSGI 服务器时,我注意到在循环中对 time.sleep() 的一些测试调用仅在第一次迭代中起作用。这是复制品:
import os
import signal
import time
def run_loop():
i = 0
while True:
print('PID: {}, i = {}'.format(os.getpid(), i))
time.sleep(5) # Only works the first time
i += 1
pid = os.fork() . # May or may not be related?
if pid == 0:
print('PID: {}, CHILD'.format(os.getpid(), i))
os._exit(0)
if __name__ == '__main__':
# If I uncomment this line it works fine.
# If I leave it as is, the time.sleep in run_loop() only waits once.
signal.signal(signal.SIGCHLD, lambda a, b: os.wait())
run_loop()
我知道 time.sleep() 文档中的以下部分。
实际的挂起时间可能少于请求的时间,因为任何捕获的信号都会在执行该信号的捕获例程后终止 sleep()。
这是因为SIGCHLD 信号在time.sleep() 运行时不断触发吗?什么会导致信号一致地取消对 time.sleep() 的每次调用?
【问题讨论】:
标签: python asynchronous signals fork