欢迎访问宙启技术站
智能推送

如何使用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()方法等待所有的工作进程退出。

通过运行上述代码,可以看到每个任务的执行情况。它展示了多个工作进程之间的任务合作与协同。