简单的进程池

进程池:

  multiprocess提供了一个Pool的类来代表进程池对象。  

  Pool可以提供指定数量的进程供用户调用,默认大小是CPU的核数,当有新的【请求】提交给Pool的时候,如果Pool没有满,则创建一个进程来执行该【请求】;如果Pool已经满了,则该【请求】会等待,知道进程池中有进程结束,才会创建新的进程来处理它。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

__author__ = 'Fade Zhao'
from multiprocessing import Pool
import os,time

def Foo(num):
    time.sleep(1)
    num += 100
    print('进程ID = ',os.getpid(),num)
    return num

def Bar(arg):

    print('callback function!',arg)
    print('callback Process ID',os.getpid())

if __name__ == "__main__":
    pool = Pool(processes=10) #创建进程池,最多存放5个进程
    for i in range(10):
        # 串行执行进程
        # pool.apply(func=Foo,args=(i,))  # args=(i,) 必须要有逗号
        # 并行执行进程
        # pool.apply_async(func=Foo,args=(i,))
        # 并行执行进程且执行完成后执行回调函数(每个进程执行后)
        pool.apply_async(func=Foo,args=(i,),callback= Bar)

    print('end')
    pool.close()
   poll.join()
    # 进程池中进程执行完成后在关闭,如果不用join,程序直接关闭
    # join()必须放在close()之后,且close() 进程池不许再添加Process了


>>>

  进程ID = 7763 101
  进程ID = 7764 102
  进程ID = 7762 100
  进程ID = 7766 104
  进程ID = 7765 103
  callback function! 103
  callback Process ID 7761
  callback function! 104
  callback Process ID 7761
  callback function! 102
  callback Process ID 7761
  callback function! 101
  callback Process ID 7761
  callback function! 100
  callback Process ID 7761
  进程ID = 7769 107
  进程ID = 7770 108
  进程ID = 7771 109
  进程ID = 7768 106
  进程ID = 7767 105
  callback function! 108
  callback Process ID 7761
  callback function! 109
  callback Process ID 7761
  callback function! 107
  callback Process ID 7761
  callback function! 106
  callback Process ID 7761
  callback function! 105
  callback Process ID 7761

 

  我们会发现,输出的顺序是乱的,这个是必然的,因为都是并发执行线程,所以咱们也不确定到底哪个先执行。这个是由CPU决定的。

  当一个任务结束了,新的任务依次天剑进来,任务执行使用的进程依然是原来的进程。

 

posted @ 2017-06-29 22:36  LeeeetMe  阅读(121)  评论(0编辑  收藏  举报