|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
如果您觉得本篇CentOSLinux教程讲得好,请记得点击右边漂浮的分享程序,把好文章分享给你的好朋友们!我们常常会接纳临盆者/消耗者干系的两个线程来处置一个同享缓冲区的数据。比方一个临盆者线程承受用户数据放进一个同享缓冲区里,守候一个消耗者线程对数据掏出处置。可是假如缓冲区的太小而临盆者和消耗者两个异步线程的速率分歧时,简单呈现一个线程守候另外一个情形。为了尽量的延长同享资本并以不异速率事情的各线程的守候工夫,我们可使用一个“行列”来供应分外的缓冲区。
创立一个“行列”工具- importQueuemyqueue=Queue.Queue(maxsize=10)
复制代码 Queue.Queue类便是一个行列的同步完成。行列长度可为无穷大概无限。可经由过程Queue的机关函数的可选参数maxsize来设定行列长度。假如maxsize小于1就暗示行列长度无穷。
将一个值放进行列中挪用行列工具的put()***在队尾拔出一个项目。put()有两个参数,第一个item为必须的,为拔出项目标值;第二个block为可选参数,默许为1。假如行列以后为空且block为1,put()***就使挪用线程停息,直到空出一个数据单位。假如block为0,put***将激发Full非常。
将一个值从行列中掏出挪用行列工具的get()***从队头删除并前往一个项目。可选参数为block,默许为1。假如行列为空且block为1,get()就使挪用线程停息,直至有项目可用。假如block为0,行列将激发Empty非常。
我们用一个例子来展现怎样利用Queue
- #!/usr/bin/envpythonimportQueueimportthreadingimporturllib2importtimehosts=["http://yahoo.com","http://谷歌.com.hk","http://amazon.com","http://ibm.com","http://apple.com"]queue=Queue.Queue()classThreadUrl(threading.Thread):"""ThreadedUrlGrab"""def__init__(self,queue):threading.Thread.__init__(self)self.queue=queuedefrun(self):whileTrue:#grabshostfromqueuehost=self.queue.get()#grabsurlsofhostsandprintsfirst1024bytesofpageurl=urllib2.urlopen(host)printurl.read(1024)#signalstoqueuejobisdoneself.queue.task_done()start=time.time()defmain():#spawnapoolofthreads,andpassthemqueueinstanceforiinrange(5):t=ThreadUrl(queue)t.setDaemon(True)t.start()#populatequeuewithdataforhostinhosts:queue.put(host)#waitonthequeueuntileverythinghasbeenprocessedqueue.join()main()print"ElapsedTime:%s"%(time.time()-start)
复制代码
在Python中利用线程时,这个形式是一种很罕见的而且保举利用的体例。详细事情步调形貌以下:
- 创立一个Queue.Queue()的实例,然后利用数据对它举行添补。
- 将经由添补数据的实例传送给线程类,后者是经由过程承继threading.Thread的体例创立的。
- 天生保卫线程池。
- 每次从行列中掏出一个项目,并利用该线程中的数据和run***以实行响应的事情。
- 在完成这项事情以后,利用queue.task_done()函数向义务已完成的行列发送一个旌旗灯号。
- 对行列实行join操纵,实践上意味着比及行列为空,再加入主步伐。
在利用这个形式时必要注重一点:经由过程将保卫线程设置为true,将同意主线程大概步伐仅在保卫线程处于举动形态时才干够加入。这类体例创立了一种复杂的体例以把持步伐流程,由于在加入之前,您能够对行列实行join操纵、大概比及行列为空。
join()
坚持堵塞形态,直各处理了行列中的一切项目为止。在将一个项目增加到该行列时,未完成的义务的总数就会增添。当利用者线程挪用task_done()以暗示检索了该项目、并完成了一切的事情时,那末未完成的义务的总数就会削减。当未完成的义务的总数削减到零时,join()就会停止堵塞形态。
如果您觉得本篇CentOSLinux教程讲得好,请记得点击右边漂浮的分享程序,把好文章分享给你的小伙伴们! |
|