Python 多进程池进行并发处理

  • Post category:Python

Python 多进程池是一种并发处理方式,可以在处理IO密集型任务时提高程序的效率。使用多进程池,可以同时调用多个进程处理任务。以下是Python多进程池进行并发处理的使用方法。

建立多进程池

使用Python的内置模块multiprocessing,可以轻松地创建多进程池。在开始处理任务之前,需要建立一个多进程池。

from multiprocessing import Pool

# 创建多进程池,括号内为最大进程数
pool = Pool(4)

使用多进程池处理任务

将需要处理的任务传入多进程池中。使用apply_async函数进行非阻塞式调用,或使用map函数进行阻塞式调用。

非阻塞式调用

def func(num):
    # 处理任务的函数,这里简单示范打印数字
    print(num)

if __name__ == '__main__':
    # 建立多进程池
    pool = Pool(4)

    # 传入任务,使用非阻塞式调用
    for i in range(10):
        pool.apply_async(func, args=(i,))

    # 关闭多进程池
    pool.close()

    # 等待所有任务完成
    pool.join()

阻塞式调用

def func(num):
    # 处理任务的函数,这里简单示范返回数字的平方
    return num*num

if __name__ == '__main__':
    # 建立多进程池
    pool = Pool(4)

    # 传入任务,使用阻塞式调用
    res = pool.map(func, range(10))

    # 关闭多进程池
    pool.close()

    # 输出结果
    print(res)

在以上示例中,建立了一个含有4个进程的多进程池。使用apply_async函数传入10个任务并打印数字或使用map函数传入10个任务并返回平方数组成的列表。

主进程与子进程的交互

多进程池中的子进程是独立的进程,无法访问主进程中的变量。需要使用Queue通信队列将数据从主进程传入子进程,或从子进程中取回结果。

from multiprocessing import Process, Queue

def func(q):
    # 处理任务的函数,这里示范从队列中取出数据,并将平方值返回队列中
    while True:
        num = q.get()
        if num is None:
            break
        res = num*num
        q.put(res)

if __name__ == '__main__':
    # 建立通信队列
    q = Queue()

    # 建立子进程
    p = Process(target=func, args=(q,))
    p.start()

    # 传入任务
    for i in range(10):
        q.put(i)

    # 发送完成信号
    q.put(None)

    # 取回结果
    res = []
    while True:
        r = q.get()
        if r is None:
            break
        res.append(r)

    # 关闭子进程
    p.join()

    # 输出结果
    print(res)

在以上示例中,建立了一个通信队列,并在子进程中处理从队列中获取的任务,并将结果返回队列中。在主进程中将任务传入队列,并从队列中取回结果并组成列表。最后关闭子进程并输出结果。

以上为使用Python多进程池进行并发处理的完整攻略,包含了建立进程池、处理任务、主进程与子进程的交互等过程的示例说明。