线程
Queue是python中的标准库,可以直接import引入。就是著名的“先吃先拉”和后吃后吐,可以定义它的容量,别吃撑了,吃多了,就会报错,构造的时候不写或者写个小于1的数则表示无限多
import Queue
q=Queue.Queue(10)
向队列中放值put
q.put("yang")
q.put(4)
在队列中取值是get,默认的队列是先进先出的
q.get()
"yang"
当一个队列为空的时候,如果再用get取值则会堵塞,所以取队列的时候一般是用到get_nowait()方法,这种方法在向一个空队列取值的时候,会抛出一个Empty异常,所以更常用 方法是先判断队列是否为空,如果不为空,则取值。队列中常用的方法:
Queue.qsize()返回队列的大小
Queue.empty()如果队列为空,返回True,反之返回False
Queue.full()如果队列满了,返回True,反之False
Queue.get([block[,timeout]])获取队列,timeout等待时间
Queue.get_nowait()相当于Queue.get(False)
非阻塞Queue.put(item)写入队列 ,timeout等待时间
Queue.put_nowait(item)相当Queue.put(item,False)
二、multiprocessing中使用子进程概念
from multiprocessing import Process
可以通过process来构造一个子进程
p=process(target=fun,args=(args))
再通过start()来启动子进程
再通过p.join()方法来使得子进程运行结束后再执行父进程
eg:from multiprocessing import process
import os
#子进程要执行的代码
def run_proc(name):
print "...."%(name,os.getpid())
if __name__=='__main__':
print 'parent process %s'%os.getpid()
p=Process(target=run_proc,args=('test',))
print 'process will start'
p.start()
p.join()
print process end'
三、在multiprocessing中使用pool
如果需要多个子进程时,可以考虑使用进程池(pool)来管理
from multiprocessing import pool
import os,time
def long_time_task(name):
print ''run task %(%s)%(name,os.getpid())
start = time.time()
time.sleep(3)
end=time.time()
print 'task %s runs%0.2f seconds'%(name,end-start)
if __name__ =='__main__':
print 'parent process %s'%os.getpid()
p = pool()
for i in range(5):
p.apply_async(long_time_task,args=(i,))
print 'waiting for all subprocess donw'
p.close()
p.join()
print 'all subprocess done'
pool创建子进程的方法与process不同,是通过p.apply_async(func,args=(args,)实现,一个池子里能同时运行的任务数取决你的电脑的cpu的数量,如果电脑里面现在是有4个cpu,那么子进程task0,task1,task2,task3可以同时启动,task4则在之前的一个某个进程结束后才开始。
代码中的p.close()是关掉进程池子,是不再向里面添加进程了,对pool对象调用join()方法会等待所有子进程执行完毕,调用join()之前必须先调用close(),调用close之后就不能继续添加新的process了
也可以在实例化pool的时候给他定义一个进程的多少,如果上面的代码是p=pool(5),那么所有的子进程就可以同时进程
四。多个子进程之间的通信
多个子进程间的通信就要采用第一步说道的Queue,比如有以下的需求,一个子进程向队列中写数据,另一个进程从队列中取数据