在多线程multiprocessing模块中,有两个类,Queue(队列)和Process(进程);python
在Queue.py中也有一个Queue类,这两个Queue的区别?多线程
from multiprocessing import Queue,Process引入multiprocessing模块中的队列和进程类app
队列Queue:dom
Queue是python中的标准库,能够直接import引用在队列中;Queue.Queue(maxsize)建立队列对象,若是不提供maxsize,则队列数无限制。async
# _*_ encoding:utf-8 _*_ import Queue q = Queue.Queue(10) q.put('SB') q.put('You') print (q.get()) print (q.get())
当一个队列为空的时候,用get取回堵塞,因此通常取队列的时候会用,get_nowait()方法,这个方法在向一个空队列取值的时候会抛一个Empty异常,因此通常会先判断队列是否为空,若是不为空则取值;函数
不阻塞的方式取队列spa
判断队列是否为空,为空返回True,不为空返回False线程
返回队列的长度code
Queue.get([block[, timeout]]) 获取队列,timeout等待时间
Queue.get_nowait() 至关Queue.get(False)
非阻塞 Queue.put(item) 写入队列,timeout等待时间
Queue.put_nowait(item) 至关Queue.put(item, False)对象
Multiprocessing中使用子进程的概念Process:
from multiprocessing import Process
能够经过Process来构造一个子进程
p=Process(target=fun,args=(args))
再经过p.start()来启动子进程
再经过p.join()方法来使得子进程运行结束后再执行父进程
在multiprocessing中使用pool:
若是须要多个子进程时能够考虑使用进程池(pool)来管理
Pool建立子进程的方法与Process不一样,是经过p.apply_async(func,args=(args))实现,一个池子里能同时运行的任务是取决你电脑CPU的数量,若是是4个CPU,那么会有task0,task1,task2,task3同时启动,task4须要在某个进程结束后才开始。
多个子进程间的通讯:
多个子进程间的通讯就要采用第一步中的队列Queue,好比,有如下需求,一个子进程向队列中写数据,另外一个进程从队列中取数据,
# _*_ encoding:utf-8 _*_ from multiprocessing import Process,Queue,Pool,Pipe import os,time,random #写数据进程执行的代码: def write(p): for value in ['A','B','C']: print ('Write---Before Put value---Put %s to queue...' % value) p.put(value) print ('Write---After Put value') time.sleep(random.random()) print ('Write---After sleep') #读数据进程执行的代码: def read(p): while True: print ('Read---Before get value') value = p.get(True) print ('Read---After get value---Get %s from queue.' % value) if __name__ == '__main__': #父进程建立Queue,并传给各个子进程: p = Queue() pw = Process(target=write,args=(p,)) pr = Process(target=read,args=(p,)) #启动子进程pw,写入: pw.start() #启动子进程pr,读取: pr.start() #等待pw结束: pw.join() #pr进程里是死循环,没法等待其结束,只能强行终止: pr.terminate()
关于锁的应用,在不一样程序间若是有同时对同一个队列操做的时候,为了不错误,能够在某个函数操做队列的时候给它加把锁,这样在同一个时间内则只能有一个子进程对队列进行操做,锁也要在manager对象中的锁