前言:

python在同一个线程中多次执行同一方法时,该方法执行耗时较长且每次执行过程及结果互不影响,如果只在主进程中执行,效率会很低,因此使用multiprocessing.Pool(processes=n)及其apply_async()方法提高程序执行的并行度从而提高程序的执行效率,其中processes=n为程序并行执行的进程数。

 apply_async是异步非阻塞式,不用等待当前进程执行完毕,随时跟进操作系统调度来进行进程切换,即多个进程并行执行,提高程序的执行效率。

示例代码1:

import time
import random
import multiprocessing
 
def func(x):
    ts = random.randint(1, 10)
    time.sleep(ts)
    print(f'{x}执行完毕!耗时{ts}s')
 
if __name__ == '__main__':
    pool = multiprocessing.Pool(6)
    for i in range(6):
        print(f"开始执行第{i}个任务...")
        pool.apply_async(func, args=(i, ))
    pool.close()
    pool.join()

运行结果:

python多进程使用apply_async的使用方法详解

在使用apply_async()方法接收多个参数的方法时,在任务方法中正常定义多个参数,参数以元组形式传入即可 但是给apply_async()方法传入多个值获取多个迭代结果时就会报错,因为该方法只能接收一个值,所以可以将该方法放入一个列表生成式中。

示例代码2:

import multiprocessing
 
def func(x):
    return x ** 2
 
if __name__ == '__main__':
    pool = multiprocessing.Pool()
    res = [pool.apply_async(func, (i, )) for i in range(6)]
    print([x for x in res])
    print([x.get() for x in res])
    pool.close()
    pool.join()

运行结果:

python多进程使用apply_async的使用方法详解

注意:join()等待所有子进程结束后再运行,使用join()前先使用close()关闭它。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。