You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 21:20:14