多重处理是一个支持使用API生成程序的程序包。该软件包用于本地和远程并发。使用此模块,程序员可以在给定的计算机上使用多个处理器。它可以在Windows和UNIX操作系统上运行。
该程序包中包含所有等效的同步原语。
from multiprocessing import Process, Lock def my_function(x, y): x.acquire() print ('hello world', y) x.release() if __name__ == '__main__': lock = Lock() for num in range(10): Process(target= my_function, args=(lock, num)).start()
在这里,一个实例可以锁定以确保一次只能有一个进程显示标准输出。
对于池,我们使用Pool类。当一个人可以创建一个流程池时,它将承载提交给它的所有任务。
class multiprocessing.Pool([processes[, initializer[, initargs[, maxtasksperchild]]]])
池对象控制工作池以选择可以提交的作业,它支持异步结果,该结果具有超时,回调和并行映射实现。
如果进程为空,则使用cpu_count();如果初始化为非none,则使用initializer(* initargs)调用此函数。
apply(func[, args[, kwds]])
这与apply()
内置功能相同。在结果准备就绪之前,此方法将一直阻塞,如果要并行执行,则apply_async()方法更好。
apply_async(func[, args[, kwds[, callback]]])
返回结果对象。
map(func,可迭代[,chunksize])
map()是一个内置函数,它仅支持一个可迭代的参数。它会阻塞直到结果准备就绪。
在这种方法中,可迭代分解成许多小块,并将这些小部分作为单独的任务提交给进程池。
map_async(func,iterable [,chunksize [,callback]])
返回结果对象。
imap(func,iterable [,chunksize])
与itertools.imap()相同。
参数的大小与中使用的相同map()
。
imap_unordered(func,iterable [,chunksize])
这与imap()
重新调整迭代器的顺序相同。
关()
工作人员完成所有任务后,工作人员将退出流程。
终止()
如果我们要立即停止工作进程而不完成任务,则使用此方法。
加入()
在使用join()
方法之前,必须使用close()
和terminate()
函数。
类multiprocessing.pool.AsyncResult
由Pool.apply_async()和Pool.map_async()返回。
get([超时])
此函数在到达时返回结果。
等待([超时])
使用此等待功能,我们等待结果可用或直到超时秒过去。
准备()
此函数返回呼叫是否完成。
成功()
调用完成后无任何错误,此函数将返回。
# -*- coding: utf-8 -*- """ Created on Sun Sep 30 12:17:58 2018 @author: nhooo.com """ from multiprocessing import Pool import time def myfunction(m): return m*m if __name__ == '__main__': my_pool = Pool(processes=4) # start 4 worker processes result = my_pool.apply_async(myfunction, (10,)) # evaluate "f(10)" asynchronously in a single process print (result.get(timeout=1)) print (my_pool.map(myfunction, range(10))) # prints "[0, 1, 4,..., 81]" my_it = my_pool.imap(myfunction, range(10)) print (my_it.next() ) # prints "0" print (my_it.next() ) # prints "1" print (my_it.next(timeout=1) ) # prints "4" unless your computer is *very* slow result = my_pool.apply_async(time.sleep, (10,)) print (result.get(timeout=1) ) # raises multiprocessing.TimeoutError