Python中进程的同步和池化

流程之间的同步

多重处理是一个支持使用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