如何在Python中周期性交替启停多进程?求多线程实现方案
问题分析与解决方案
先纠正你对multiprocessing.Event的理解
set():将事件标记为已触发状态,所有因调用该事件wait()而阻塞的进程/线程会立即恢复执行clear():将事件重置为未触发状态,后续调用该事件wait()的进程/线程会进入阻塞,直到事件被再次set()wait(timeout=None):如果事件当前是已触发状态,直接返回True;如果是未触发,就阻塞在这里,直到事件被set()(返回True)或超时(返回False)
你的原代码问题在于:每个进程没有先等待“允许运行”的信号,一启动就直接打印运行;而且进程自己去操作其他事件的wait()完全逻辑混乱,应该由主进程统一控制事件的触发与重置,让各个进程只监听自己的专属事件。
多进程修正实现
下面是符合需求的代码,主进程负责轮流切换允许运行的进程:
import multiprocessing import time def worker(process_name, run_event): while True: # 等待自己的运行信号,没信号就阻塞 run_event.wait() print(f"{process_name} is running...") # 模拟运行5秒 time.sleep(5) # 运行结束后,主动把自己的信号清掉,避免重复运行 run_event.clear() if __name__ == "__main__": # 创建4个事件,初始都设为未触发 events = [multiprocessing.Event() for _ in range(4)] processes = [] # 创建并启动所有进程 for i in range(4): p = multiprocessing.Process( target=worker, args=(f"Process {i}", events[i]) ) processes.append(p) p.start() # 主进程负责轮流切换 try: while True: for event in events: # 触发当前进程的运行信号 event.set() # 等待该进程运行5秒(和worker里的sleep对应) time.sleep(5) # 清掉信号,让进程阻塞 event.clear() except KeyboardInterrupt: # 捕获Ctrl+C,终止所有进程 for p in processes: p.terminate() for p in processes: p.join()
多线程版本实现
线程版本逻辑和进程几乎一致,只是把multiprocessing换成threading:
import threading import time def worker(thread_name, run_event): while True: run_event.wait() print(f"{thread_name} is running...") time.sleep(5) run_event.clear() if __name__ == "__main__": events = [threading.Event() for _ in range(4)] threads = [] for i in range(4): t = threading.Thread( target=worker, args=(f"Thread {i}", events[i]) ) threads.append(t) t.daemon = True # 设置为守护线程,主进程退出时自动结束 t.start() try: while True: for event in events: event.set() time.sleep(5) event.clear() except KeyboardInterrupt: print("Stopping all threads...")
内容的提问来源于stack exchange,提问作者HiImEins
相关产品推荐
相关产品推荐

