首页 > 解决方案 > Python Multiprocessing Process.start() 等待进程启动

问题描述

我有一些测试用例,我在其中启动一个网络服务器进程,然后运行一些 URL 测试来检查每个函数是否运行良好。

服务器进程的启动时间取决于执行它的系统。只需几秒钟,我现在使用 time.sleep(5)。但老实说,我不是 sleep() 的忠实粉丝,因为它可能适用于我的系统,但是如果测试在服务器需要 6 秒才能启动的系统上运行怎么办......(所以这样做从来都不安全。 .) 测试将无缘无故地失败。

所以问题是:有没有一种很好的方法来检查这个过程是否真的开始了。

我使用 python 多处理模块示例:

from multiprocessing import Process
import testapp.server
import requests
import testapp.config as cfg
import time
p = Process(target=testapp.server.main)
p.start()
time.sleep(5)
testurl=cfg.server_settings["protocol"] + cfg.server_settings["host"] + ":" +str(cfg.server_settings["port"]) + "/test/12"  

r = requests.get(testurl)
p.terminate()
assert int(r.text)==12

所以最好避免 sleep() 并真正检查进程何时开始......

标签: pythonpython-3.xtestingmultiprocessing

解决方案


您应该使用is_alive( docsstart() ) 但在您启动该过程后几乎总是会返回 True 。如果您想确保该过程已经在做一些重要的事情,那么就无法绕过time.sleep(至少从这一点开始,请查看最后一段以获得另一个想法)

在任何情况下,您都可以这样实现is_alive

p = Process(target=testapp.server.main)
p.start()
while not p.is_alive():
    time.sleep(0.1)
do_something_once_alive()

如您所见,我们仍然需要“睡眠”并再次检查(只需 0.1 秒),但距离is_alive返回可能不到 5 秒True

如果两者is_alivetime.sleep都不够准确,您无法知道该过程是否确实执行了某些特定操作,并且如果您也在控制另一个程序,则应该让它升起另一种标志,以便您知道自己很擅长去。


推荐阅读