多进程

multiprocess 模块

  1. process

     from multiprocessing import Process, Pool
     import time
     import random
     import os
    
     def run_task(name):
         print "Child process %s(%s) is running." % (name, os.getpid())
    
     if __name__ == "__main__":
         print "Current process %s." % os.getpid()
         for i in range(5):
             p = Process(target=run_task, args=(str(i), ))
             p.start()
             p.join()
         
         print "Waiting for subprocess done"
    

    process.join用来阻塞进程,等上一个p进程执行完,才往下继续执行
    如果没有指定target,默认执行process.run方法

  2. pool
    创建容量为3的线程池,并依次向其中加入5个任务,从结果看,虽然添加了5个任务,但是一开始只运行了其中的3个,而且每次最多运行3个,当一个任务结束了,新的任务添加进来,任务 执行使用的进程依然是原来的进程,这一点从进程的pid可以看出来

     from multiprocessing import Process, Pool
     import time
     import random
     import os
    
     def run_task(name):
         print "Child process %s(%s) is running." % (name, os.getpid())
         time.sleep(random.random() * 4)
         print "Child process %s(%s) end." % (name, os.getpid())
    
     if __name__ == '__main__':
         print "Current process %s." % os.getpid()
         p = Pool(processes=3)
         for i in range(5):
             p.apply_async(run_task, args=(str(i), ))
         print "Waiting for all subprocess done..."
         p.close()    #调用join之前,必须调用close,调用close之后,不能再向进程池中添加进程
         p.join()
         print "All subprocess done..."
    
多进程_第1张图片
pool.png
  1. 进程间通信
    创建了大量的进程,就必须进程间的通信,python提供多种进程间通信的方式,例如Queue,Pipe,Value+Array等
    Queue和Pipe的区别在于,Pipe主要用来两个进程间通信,Queue用来多个进程间通信

    1. Queue是多进程安全的队列,可以使用Queue实现多进程之间的数据传递
      • Put方法用来向队列中插入数据,可选参数为blocked,timeout,如果blocked为True(默认值),并且timeout为正值,该方法会阻塞timeout指定的时间,直到该队列有剩余的空间,如果超时,会抛出Queue.Full异常,如果blocked为False,改Queue已满,则立即抛出Queue,Full异常

      • Get方法可以从队列中读取并删除一个元素,可选参数为blocked,timeout,如果blocked为True(默认值),并且timeout为正值,那么在等待的timeout时间内没有取到任何元素,会抛出Queue.Empty异常,如果blocked为False,Queue中有一个值,则立即返回该值,否则立即抛出Queue.Empty异常

你可能感兴趣的:(多进程)