python进程池的使用

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

Pool([numprocess [, initializer [, initargs]]])

           其中numprocess是要创建的进程数。如果省略此参数,将使用cpu_count()的值。Initializer是每个工作进程启动时要执行的可调用对象。Initargs是要传递给initializer的参数元祖。Initializer默认为None。
Pool类的实例方法如下表所示。

方法 描述
apply(func [,args [,kwargs]]) 在一个池工作进程中执行函数(*args,**kwargs),然后返回结果。
apply_async(func [, args [,kwargs [,callback ] ] ]) 在一个池工作进程中异步地执行函数(*args,**kwargs),然后返回结果。此方法的结果是AsyncResult类的实例,稍后可用于获得最终结果。Callback是可调用对象,接受输入参数。当func的结果变为可用时,将立即传递给callback。Callback禁止执行任何阻塞操作,否则将阻塞接收其他异步操作中的结果
close() 关闭进程池,防止进行进一步操作。如果还有挂起的操作,它们将在工作进程终止之前完成
join() 等待所有工作进程退出。此方法只能在close()或者terminate()方法之后调用
imap( func,iterable [ ,chunksize] ) imap( func,iterable [ ,chunksize] )
imap_unordered( func,iterable [,chunksize] ) 同imap()函数一样,只是结果的顺序根据从工作进程接收到的时间任意确定
map( func,iterable [,chunksize] ) 将可调用对象func应用给iterable中的所有项,然后以列表的形式返回结果。通过将iterable划分为多块并将工作分派给工作进程,可以并行地执行这项操作。chunksize指定每块中的项数。如果数量较大,可以增大chunksize的值来提升性能
map_async( func,iterable [,chunksize [,callback]] ) 同map()函数,但结果的返回是异步的。返回值是AsyncResult类的实例,稍后可用与获取结果。Callback是指接受一个参数的可调对象。如果提供callable,当结果变为可用时,将使用结果调用callable
terminate() 立即终止所有工作进程,同时不执行任何清理或结束任何挂起工作。如果p被垃圾回收,将自动调用此函数
get( [ timeout] ) 返回结果,如果有必要则等待结果到达。Timeout是可选的超时。如果结果在指定时间内没有到达,将引发multiprocessing.TimeoutError异常。如果远程操作中引发了异常,它将在调用此方法时再次被引发
ready() 如果调用完成,则返回True
sucessful() 如果调用完成且没有引发异常,返回True。如果在结果就绪之前调用此方法,将引发AssertionError异常
如果调用完成且没有引发异常,返回True。如果在结果就绪之前调用此方法,将引发AssertionError异常 等待结果变为可用。Timeout是可选的超时

注意:
apply_async(func[, args[, kwds[, callback]]]) 它是非阻塞,apply(func[, args[, kwds]])是阻塞的
【示例】进程池的使用(非阻塞)

import multiprocessing
import time

def func(msg):
    print("start:", msg)
    time.sleep(3)
    print("end:",msg)

if __name__ == "__main__":
    pool = multiprocessing.Pool(processes = 3)
    for i in range(5):
        msg = "hello %d" %(i)
        #维持执行的进程总数为processes,当一个进程执行完毕后会添加新的进程进去
        pool.apply_async(func, (msg, ))

    pool.close()#进程池关闭之后不再接收新的请求
    #调用join之前,先调用close函数,否则会出错。
    # 执行完close后不会有新的进程加入到pool,join函数等待所有子进程结束
    pool.join()
原创文章 81 获赞 48 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_15181569/article/details/98320459