马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
表明
- 设置启动方法:
- 使用 set_start_method 来指定历程启动的方法。这行代码应该尽大概早地实行,而且只能被调用一次。对于 macOS 和 Linux 体系,默认是 fork,而对于 Windows 则默认是 spawn。这里我们实验设置为 fork,但假如有辩说则跳过(比方当脚本已经被导入时)。
- 界说工作者函数:
- worker 函数代表了每个子历程要实行的任务。它起首实验从队列中获取一条消息,然后模拟一些工作(在这里是简朴的 time.sleep(1)),末了将一条新消息放入队列。
- 主步伐逻辑:
- 在主步伐中,我们起首创建了一个 Queue 实例用于历程间的通讯。
- 接着,我们向队列中放入了一条初始消息,以供第一个子历程读取。
- 然后,我们创建了多少个子历程,并启动它们。每个子历程都将调用 worker 函数。
- 使用 join() 方法等待全部子历程完成。
- 末了,主步伐遍历队列中的全部消息,并打印出来,以展示全部子历程的工作结果。
这种布局使得代码更加模块化和易读,同时也明确了各个部分的功能。- import time
- from multiprocessing import Process, Queue, set_start_method
- def worker(queue, worker_id):
- """
- 工作进程的主函数。
-
- 参数:
- - queue: 进程间通信的队列。
- - worker_id: 工作进程的标识符。
-
- 返回值: 无
- """
- # 尝试从队列中获取一条消息(如果有的话)
- if not queue.empty():
- msg = queue.get()
- print(f"Worker {worker_id}: Received message '{msg}'")
- # 模拟工作负载
- time.sleep(1)
- # 向队列中放入一条消息
- response_msg = f"Message from Worker {worker_id}"
- queue.put(response_msg)
- print(f"Worker {worker_id}: Sent message '{response_msg}'")
- if __name__ == "__main__":
- # 设置启动方法为 "fork" 或 "spawn"(根据操作系统选择),并且必须在创建任何进程前调用
- try:
- set_start_method('fork') # 对于 Unix/Linux/macOS 系统
- except RuntimeError:
- pass # 如果已经设置了启动方法,则忽略错误
- # 创建一个队列对象
- queue = Queue()
- # 初始化进程列表
- processes = []
- num_workers = 5 # 定义多少个子进程
- # 向队列添加初始消息
- initial_message = "Start Message"
- queue.put(initial_message)
- print(f"Main: Sent initial message '{initial_message}'")
- # 创建并启动子进程
- for i in range(num_workers):
- p = Process(target=worker, args=(queue, i))
- p.start()
- processes.append(p)
- # 等待所有子进程完成
- for p in processes:
- p.join()
- print("Main: All workers have finished.")
- print("############# Final Messages #############")
- # 收集并打印队列中的剩余消息
- while not queue.empty():
- print(f"Main: Received final message '{queue.get()}'")
复制代码- Main: Sent initial message 'Start Message'
- Worker 0: Received message 'Start Message'
- Worker 0: Sent message 'Message from Worker 0'
- Worker 1: Sent message 'Message from Worker 1'Worker 2: Sent message 'Message from Worker 2'
- Worker 3: Sent message 'Message from Worker 3'
- Worker 4: Sent message 'Message from Worker 4'
- Main: All workers have finished.
- ############# Final Messages #############
- Main: Received final message 'Message from Worker 0'
- Main: Received final message 'Message from Worker 1'
- Main: Received final message 'Message from Worker 2'
- Main: Received final message 'Message from Worker 3'
- Main: Received final message 'Message from Worker 4'
复制代码
|