发布网友 发布时间:2024-09-26 22:06
共1个回答
热心网友 时间:2024-10-21 17:07
在使用多进程的过程中,最好不要使用共享资源。普通的全局变量是不能被子进程所共享的,只有通过multiprocessing组件构造的数据结构可以被共享。
Queue是用来创建进程间资源共享的队列的类,使用Queue可以达到多进程间数据传递的功能。但是Queue只能在Process类中使用,不能再Pool类中使用。
1.基本介绍1.1 构造方法Queue([maxsize])
maxsize是队列中允许最大项数,省略则为无限大队列
1.2 实例方法put():用来在队列中插入数据。该方法有2个可选参数:blocked和timeout。若blocked的值为True(默认值)且timeout的值大于0,该方法会阻塞timeout的时间,直到该队列有剩余的空间。超时抛出Queue.Full异常。若blocked的值为False,且Queue已满,则会立即抛出Queue.Full异常
get():从队列获取一个元素并且删除该元素,类似于列表的pop()方法。该方法也有2个可选参数:blocked和timeout。若blocked的值为True(默认值)且timeout的值大于0,会在timeout的时间内没有获取到抛出Queue.Empty异常。若blocked的值为False,且队列有一个元素可用,则返回该元素。若blocked的值为False,且队列为空则抛出Queue.Empty异常。设置blocked的值为True或者参数全部置空可以防止Queue在empty的时候抛出异常。
put_nowait():同put(blcoked=False)
get_nowait():同get(blcoked=False)
empty():判断队列是否为空。但是该方法在队列为空返回True时不可靠,比如返回True时put()方法插入了新的数据。
full():判断队列是否已满,该方法也不可靠,比如返回True时get()方法取走了数据。
qsize():返回队列中目前元素的数量,也不可靠,原因同empty()和full()
2.使用示例frommultiprocessingimportQueue,Processimportosimporttimeimportrandomdefwrite(q):print(f'Processtowrite:{os.getpid()}')forvalueinrange(5):print(f'put{value}toqueue......')q.put(value)time.sleep(random.random())defread(q):print(f'Processtoread:{os.getpid()}')whileTrue:value=q.get(True)print(f'get{value}fromqueue......')if__name__=='__main__':q=Queue()pw=Process(target=write,args=(q,))pr=Process(target=read,args=(q,))pw.start()pr.start()pw.join()pr.terminate()result:
Processtowrite:2856put0toqueue......Processtoread:17560get0fromqueue......put1toqueue......get1fromqueue......put2toqueue......get2fromqueue......put3toqueue......get3fromqueue......put4toqueue......get4fromqueue......