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

Python中的进程池同步与异步执行方式比较

发布时间:2023-12-29 08:01:59

Python中的多进程编程可以使用进程池来实现,而进程池的执行方式可以分为同步和异步两种方式。下面将介绍这两种方式的区别,并给出相应的使用例子。

1. 同步执行方式:

同步执行方式是指主进程在调用进程池的执行方法后,会等待所有子进程执行完成后再继续执行后续代码。这种方式适用于需要等待所有子进程执行完成后才能进行下一步操作的场景。

下面是一个使用同步执行方式的例子,假设我们有一个较耗时的任务,需要分配给多个子进程来执行,并且需要等待所有子进程执行完成后再统一输出结果。代码如下:

import multiprocessing
import time

def worker(n):
    time.sleep(1)
    return n*n

if __name__ == '__main__':
    pool = multiprocessing.Pool(processes=4)
    results = []
    inputs = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    
    for i in inputs:
        result = pool.apply(worker, (i,))
        results.append(result)
        
    print(results)

在上面的例子中,我们创建了一个进程池,并通过apply方法来分配任务给子进程执行。apply方法会等待子进程执行完成后返回结果。最后我们输出所有子进程执行的结果。

2. 异步执行方式:

异步执行方式是指主进程在调用进程池的执行方法后,不会等待所有子进程执行完成,而是继续执行后续代码。这种方式适用于需要立即返回子进程执行结果,并无需等待所有子进程执行完成的场景。

下面是一个使用异步执行方式的例子,假设我们有一个较耗时的任务,需要分配给多个子进程来执行,同时我们希望能先获取到已经执行完成的子进程的结果。代码如下:

import multiprocessing
import time

def worker(n):
    time.sleep(1)
    return n*n

if __name__ == '__main__':
    pool = multiprocessing.Pool(processes=4)
    results = []
    inputs = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    
    for i in inputs:
        result = pool.apply_async(worker, (i,))
        results.append(result)

    # 获取已经执行完成的子进程结果
    for result in results:
        print(result.get())

在上面的例子中,我们使用了apply_async方法来分配任务给子进程执行,apply_async方法会立即返回一个结果对象。我们将所有结果对象存放在一个列表中,然后使用get方法获取已经执行完成的子进程的结果,并输出。

综上所述,进程池的同步和异步执行方式各有适用场景。同步方式适用于需要等待所有子进程执行完成后再进行下一步操作的场景,而异步方式适用于需要立即获取子进程的执行结果,并无需等待所有子进程执行完成的场景。具体选择使用哪种方式取决于具体的业务需求。