multiprocessing 使用笔记

python multiprocessing

在利用Python进行系统管理的时候,特别是同时操作多个文件目录,或者远程控制多台主机,并行操作可以节约大量的时间。当被操作对象数目不大时,可以直接利用multiprocessing中的Process动态成生多个进程,十几个还好,但如果是上百个,上千个目标,手动的去限制进程数量却又太过繁琐,此时可以发挥进程池的功效。
Pool可以提供指定数量的进程供用户调用,当有新的请求提交到pool中时,如果池还没有满,那么就会创建一个新的进程用来执行该请求;但如果池中的进程数已经达到规定最大值,那么该请求就会等待,直到池中有进程结束,才会创建新的进程来它。

例1:pool.map()

from multiprocessing import Pool

def apply_parallel(data):
    with Pool(processes=8) as pool:
	    results = pool.map(func, data)
	return results

例2:multiprocessing.Manager()

python进程间通信包括:信号,管道,消息队列,信号量,共享内存,socket等
进程间共享数据,除了处理基本的queue,pipe和value+array还提供了更高层次的封装。使用multiprocessing.Manager可以简单地使用这些高级接口。
Manager()返回的manager对象控制了一个server进程,此进程包含的python对象可以被其他的进程通过proxies来访问。从而达到多进程间数据通信且安全。
Manager支持的类型有list,dict,Namespace,Lock,RLock,Semaphore,BoundedSemaphore,Condition,Event,Queue,Value和Array。

from tqdm import tqdm
from multiprocessing import Pool, Manager


def apply_parallel(data):
    pbar = tqdm(total=len(data))

	def update(*a):
	    pbar.update()
	pool = Pool(process=8)
	nl = Manager().dict()
	for i in data:
	    pool.apply_async(func, args(i, nl), callback=update)
	pool.close()
	pool.join()
posted @ 2021-06-07 13:35  PurePluto  阅读(99)  评论(0)    收藏  举报