Python多进程:等待文件传输完成或超时后执行代码的问题
问题拆解与修复方案
你的代码里有两个核心问题,直接导致逻辑不符合预期:
join()的用法完全错误:join()方法没有返回值(永远返回None),所以if(p1.join() or p2.join(60))这个条件永远不会成立,超时后的进程终止逻辑根本不会执行。- 冗余的定时器进程
p2:完全没必要额外开一个进程做定时,join()本身就支持超时参数,一行代码就能实现“等进程完成或超时”的需求。
另外你担心的isFileTransferDone()终止问题:只要transferOngoing()能正确返回False,循环就会退出,函数执行完毕后子进程p1会自动正常终止,这部分逻辑是没问题的。
修正后的代码
import multiprocessing import time def transferOngoing(): # 替换成你实际的文件传输状态检查逻辑 # 示例:模拟传输持续30秒后结束 return time.time() - start_time < 30 def isFileTransferDone(): while transferOngoing(): # 加短sleep避免空循环占满CPU time.sleep(0.5) print("文件传输完成") if __name__ == "__main__": start_time = time.time() p1 = multiprocessing.Process(target=isFileTransferDone) p1.start() # 核心逻辑:等待p1完成,最多等60秒 p1.join(timeout=60) # 检查是否超时 if p1.is_alive(): p1.terminate() print("传输超时,已终止检查进程") else: print("传输在超时前完成") # 后续代码正常执行 print("开始执行后续业务逻辑...")
关键细节说明
join(timeout)的正确用法:主进程会在这里等待子进程p1结束,最多等60秒。不管是子进程提前结束,还是超时时间到,主进程都会继续往下走。- 子进程的自动终止:
isFileTransferDone()函数执行完最后一行后,子进程会自动退出,不需要额外处理。 - CPU资源优化:循环里加
time.sleep(0.5),避免空循环持续占用CPU,这是这类检查逻辑的常规操作。
可选优化(优雅终止)
如果你的transferOngoing()涉及到资源占用,不想用terminate()强制杀进程,可以用multiprocessing.Event来实现优雅退出:
import multiprocessing import time def transferOngoing(): return time.time() - start_time < 70 # 模拟超时场景 def isFileTransferDone(stop_event): while transferOngoing() and not stop_event.is_set(): time.sleep(0.5) if stop_event.is_set(): print("收到终止信号,停止检查") else: print("传输完成") if __name__ == "__main__": start_time = time.time() stop_event = multiprocessing.Event() p1 = multiprocessing.Process(target=isFileTransferDone, args=(stop_event,)) p1.start() p1.join(timeout=60) if p1.is_alive(): stop_event.set() # 发送终止信号 p1.join() # 等待子进程优雅退出 print("传输超时,已优雅终止检查进程") print("执行后续逻辑...")
内容的提问来源于stack exchange,提问作者Minimaxicosi
相关产品推荐
相关产品推荐

