如何在Python中让进程运行1秒后终止并启动新进程?
解决进程超时终止并切换的问题
嘿,我看了你的代码,发现几个关键问题导致你想要的“1秒超时终止进程”逻辑没生效,咱们一步步来梳理和修正:
你的代码里的核心问题
- 进程创建时的函数调用错误:你写的
multiprocessing.Process(target=queen4(number, numberblocked))会直接在主进程里执行queen4函数,而不是把它作为子进程的目标函数。正确的做法是传递函数对象,再用args参数传参。 p.join()阻塞了主进程:join()会让主进程一直等待子进程结束,所以后面的while循环根本没机会在子进程运行时执行,自然没法检测超时。- 时间判断后的变量拼写错误:最后一行的
p_creat...明显是p_create_time的拼写失误。
修正后的代码实现
这里是调整后的代码,能实现你要的“运行1秒超时就终止进程,否则等进程自然结束”的逻辑:
import time import multiprocessing TIMEOUT = 1 # 设定1秒超时 def queen4(num, blocked_num): # 这里是你的queen4函数逻辑,比如模拟耗时操作 time.sleep(2) # 示例:让函数运行2秒,超过超时时间 print("queen4执行完成") if __name__ == "__main__": number = 8 # 示例参数 numberblocked = 2 # 示例参数 p_create_time = time.time() # 正确创建子进程:传递函数对象+参数 p = multiprocessing.Process(target=queen4, args=(number, numberblocked)) p.start() i = 0 while i == 0: elapsed_time = time.time() - p_create_time if elapsed_time >= TIMEOUT: p.terminate() print("Stopped queens4.lp starting queens11.lp") i = 1 # 这里可以启动你的新进程queens11 # new_p = multiprocessing.Process(target=queens11, args=(...)) # new_p.start() elif not p.is_alive(): # 子进程自然结束了 print("queen4自然结束") i = 2 # 循环里加个小休眠,避免占用过多CPU time.sleep(0.01) print(f"循环结束标记:{i}")
关键改动说明
- 正确创建子进程:用
target=queen4传递函数引用,args元组传递参数,确保函数在子进程中执行。 - 移除
p.join():让主进程可以同时运行循环来检测超时和进程状态。 - 增加小休眠:在while循环里加
time.sleep(0.01),避免主进程一直空转占用CPU资源。 - 明确超时后的操作:终止子进程后,可以直接启动你的新进程
queens11。
这样调整后,你的逻辑就能正常工作啦——如果queen4在1秒内没跑完,就会被强制终止,然后切换到新进程;如果它提前完成,主进程也会正常退出循环。
内容的提问来源于stack exchange,提问作者Vladimir_314159




