Python 进程池

1.进程池内部维护一个进程序列,当使用时,则去进程池中获取一个进程,如果进程池序列中没有可供使用的进进程,那么程序就会等待,直到进程池中有可用进程为止。进程池设置最好等于CPU核心数量

from multiprocessing import Pool
import time
def myfunc(i):
    time.sleep(2)
    return i+1000

def callback_func(args): # 参数为上一个函数的返回值
    print('callback %s'%args)

if __name__ == '__main__':
    p = Pool(5)
    for i in range(10):
        p.apply_async(func=myfunc,args=(i,),callback=callback_func)

    p.close()  # 关闭进程池,进程池的进程还会继续执行
    p.join()

进程池的方法

  • apply(func[, args[, kwds]]) :使用arg和kwds参数调用func函数,结果返回前会一直阻塞,由于这个原因,apply_async()更适合并发执行,另外,func函数仅被pool中的一个进程运行。

  • apply_async(func[, args[, kwds[, callback[, error_callback]]]]) : apply()方法的一个变体,会返回一个结果对象。如果callback被指定,那么callback可以接收一个参数然后被调用,当结果准备好回调时会调用callback,调用失败时,则用error_callback替换callback。 Callbacks应被立即完成,否则处理结果的线程会被阻塞。

  • close() : 阻止更多的任务提交到pool,待任务完成后,工作进程会退出。

  • terminate() : 不管任务是否完成,立即停止工作进程。在对pool对象进程垃圾回收的时候,会立即调用terminate()。

  • join() : wait工作线程的退出,在调用join()前,必须调用close() or terminate()。这样是因为被终止的进程需要被父进程调用wait(join等价与wait),否则进程会成为僵尸进程。

 

apply 每个任务排队执行:进程.join()

apply_async 每个任务并发进行:可以设置回调函数:进程无.join(),进程daemon = True(主进程不会等子进程)

posted @ 2017-05-08 00:23  1916  阅读(113)  评论(0)    收藏  举报