历程间通讯

[复制链接]
发表于 2025-12-17 10:13:48 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
表明


  •         设置启动方法:

    • 使用 set_start_method 来指定历程启动的方法。这行代码应该尽大概早地实行,而且只能被调用一次。对于 macOS 和 Linux 体系,默认是 fork,而对于 Windows 则默认是 spawn。这里我们实验设置为 fork,但假如有辩说则跳过(比方当脚本已经被导入时)。

  •         界说工作者函数:

    • worker 函数代表了每个子历程要实行的任务。它起首实验从队列中获取一条消息,然后模拟一些工作(在这里是简朴的 time.sleep(1)),末了将一条新消息放入队列。

  •         主步伐逻辑:

    • 在主步伐中,我们起首创建了一个 Queue 实例用于历程间的通讯。
    • 接着,我们向队列中放入了一条初始消息,以供第一个子历程读取。
    • 然后,我们创建了多少个子历程,并启动它们。每个子历程都将调用 worker 函数。
    • 使用 join() 方法等待全部子历程完成。
    • 末了,主步伐遍历队列中的全部消息,并打印出来,以展示全部子历程的工作结果。

这种布局使得代码更加模块化和易读,同时也明确了各个部分的功能。
  1. import time
  2. from multiprocessing import Process, Queue, set_start_method
  3. def worker(queue, worker_id):
  4.     """
  5.     工作进程的主函数。
  6.    
  7.     参数:
  8.     - queue: 进程间通信的队列。
  9.     - worker_id: 工作进程的标识符。
  10.    
  11.     返回值: 无
  12.     """
  13.     # 尝试从队列中获取一条消息(如果有的话)
  14.     if not queue.empty():
  15.         msg = queue.get()
  16.         print(f"Worker {worker_id}: Received message '{msg}'")
  17.     # 模拟工作负载
  18.     time.sleep(1)
  19.     # 向队列中放入一条消息
  20.     response_msg = f"Message from Worker {worker_id}"
  21.     queue.put(response_msg)
  22.     print(f"Worker {worker_id}: Sent message '{response_msg}'")
  23. if __name__ == "__main__":
  24.     # 设置启动方法为 "fork" 或 "spawn"(根据操作系统选择),并且必须在创建任何进程前调用
  25.     try:
  26.         set_start_method('fork')  # 对于 Unix/Linux/macOS 系统
  27.     except RuntimeError:
  28.         pass  # 如果已经设置了启动方法,则忽略错误
  29.     # 创建一个队列对象
  30.     queue = Queue()
  31.     # 初始化进程列表
  32.     processes = []
  33.     num_workers = 5  # 定义多少个子进程
  34.     # 向队列添加初始消息
  35.     initial_message = "Start Message"
  36.     queue.put(initial_message)
  37.     print(f"Main: Sent initial message '{initial_message}'")
  38.     # 创建并启动子进程
  39.     for i in range(num_workers):
  40.         p = Process(target=worker, args=(queue, i))
  41.         p.start()
  42.         processes.append(p)
  43.     # 等待所有子进程完成
  44.     for p in processes:
  45.         p.join()
  46.     print("Main: All workers have finished.")
  47.     print("############# Final Messages #############")
  48.     # 收集并打印队列中的剩余消息
  49.     while not queue.empty():
  50.         print(f"Main: Received final message '{queue.get()}'")
复制代码
  1. Main: Sent initial message 'Start Message'
  2. Worker 0: Received message 'Start Message'
  3. Worker 0: Sent message 'Message from Worker 0'
  4. Worker 1: Sent message 'Message from Worker 1'Worker 2: Sent message 'Message from Worker 2'
  5. Worker 3: Sent message 'Message from Worker 3'
  6. Worker 4: Sent message 'Message from Worker 4'
  7. Main: All workers have finished.
  8. ############# Final Messages #############
  9. Main: Received final message 'Message from Worker 0'
  10. Main: Received final message 'Message from Worker 1'
  11. Main: Received final message 'Message from Worker 2'
  12. Main: Received final message 'Message from Worker 3'
  13. Main: Received final message 'Message from Worker 4'
复制代码
 

回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表