python - 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() 并真正检查进程何时开始......
解决方案
您应该使用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_alive
和time.sleep
都不够准确,您无法知道该过程是否确实执行了某些特定操作,并且如果您也在控制另一个程序,则应该让它升起另一种标志,以便您知道自己很擅长去。
推荐阅读
- ios - 有谁知道如何修复线程 1:信号 SIGABRT 错误?我已经尝试过清洁我的产品。我是 iOS 开发新手
- java - Logback 创建日志文件但不向其中写入任何内容
- java - 循环内的 ArrayList
- list - 从列表创建无限流
- vue.js - 在 Vue JS 中,从 mount() 分配数据
- android - 如何在 Kotlin 中将 ArrayList 转换为 JSONArray()
- jmeter - 如何从没有字段且响应中只有响应数据的 JMeter 中提取响应?
- reactjs - 如何使用 React 响应 websocket 断开连接
- ios - Swift 5 Compositional Layout - itemSize 和 groupSize 扭曲项目子视图
- regex - 基于模式在python中将二进制文件分割成多个文件