如何使用JoinableQueue实现进程间的任务合作与协同
发布时间:2023-12-16 21:05:28
在Python中,可以使用multiprocessing模块来实现进程间的任务合作与协同。其中,JoinableQueue是一个线程安全的队列,可以用于在进程之间传递任务和数据。
JoinableQueue提供了类似于Queue的接口,但额外提供了join()和task_done()两个方法来实现任务的合作与协同。
下面我们来演示一个使用JoinableQueue实现进程间任务合作和协同的例子:
import multiprocessing
def worker(queue):
while True:
task = queue.get() # 从队列中获取任务
if task is None:
break # 如果获取到的任务是None,则退出循环
# 执行任务的代码
result = task * task
print(f"Task {task} is done. The result is {result}.")
queue.task_done() # 标记任务完成
if __name__ == '__main__':
num_workers = multiprocessing.cpu_count() # 获取CPU核心数作为工作进程数
queue = multiprocessing.JoinableQueue()
# 创建工作进程
workers = []
for i in range(num_workers):
worker_process = multiprocessing.Process(target=worker, args=(queue,))
worker_process.start()
workers.append(worker_process)
# 向队列中放入任务
for i in range(10):
queue.put(i)
# 添加None任务用于通知工作进程退出
for _ in range(num_workers):
queue.put(None)
# 等待所有任务完成
queue.join()
# 等待工作进程退出
for worker_process in workers:
worker_process.join()
在上述代码中,首先使用multiprocessing.cpu_count()获取CPU核心数作为工作进程数。然后创建一个JoinableQueue作为任务队列。
接下来,使用multiprocessing.Process创建了相应数量的工作进程,并将队列作为参数传递给工作进程。
然后,将一些任务放入队列中,这些任务是一个简单的计算任务,每个任务将自己的平方作为结果输出。
为了通知工作进程退出,我们添加了相同数量的None任务。
然后,使用join()方法来等待队列中的任务完成。每当调用了task_done()方法标记了一个任务完成,即可通过join()方法等待该任务完成。
最后,使用join()方法等待所有的工作进程退出。
通过运行上述代码,可以看到每个任务的执行情况。它展示了多个工作进程之间的任务合作与协同。
