Dreamingk Alone

看时间流过
文章 - 10,收藏 - , 评论 - 18, trackbacks - 1

导航

公告


    我好冷,我控制不住发抖的
  身体。请原谅我!


    本blog除标明转载的文章之外,其他所有文字皆为原创,如要转载请注名作者出处,特此声明
                -- Dreamingk

文章

收藏

    相册

      Python

        PythonIc

          存档


          正在读取评论……


              我们经常会采用生产者/消费者关系的两个线程来处理一个共享缓冲区的数据。例如一个生产者线程接受用户数据放入一个共享缓冲区里,等待一个消费者线程对数据取出处理。但是如果缓冲区的太小而生产者和消费者两个异步线程的速度不同时,容易出现一个线程等待另一个情况。为了尽可能的缩短共享资源并以相同速度工作的各线程的等待时间,我们可以使用一个“队列”来提供额外的缓冲区。

              创建一个“队列”对象

              import Queue
              myqueue = Queue.Queue(maxsize = 10)

              Queue.Queue类即是一个队列的同步实现。队列长度可为无限或者有限。可通过Queue的构造函数的可选参数maxsize来设定队列长度。如果maxsize小于1就表示队列长度无限。

              将一个值放入队列中

              myqueue.put(10)

              调用队列对象的put()方法在队尾插入一个项目。put()有两个参数,第一个item为必需的,为插入项目的值;第二个block为可选参数,默认为1。如果队列当前为空且block1put()方法就使调用线程暂停,直到空出一个数据单元。如果block0put方法将引发Full异常。

              将一个值从队列中取出

              myqueue.get()

              调用队列对象的get()方法从队头删除并返回一个项目。可选参数为block,默认为1。如果队列为空且block1get()就使调用线程暂停,直至有项目可用。如果block为0,队列将引发Empty异常。

              我们用一个例子来展示如何使用Queue

          # queue_example.py
          from Queue import Queue
          import threading
          import random
          import time

          # Producer thread
          class Producer(threading.Thread):
              def __init__(self, threadname, queue):
                  threading.Thread.__init__(self, name = threadname)
                  self.sharedata = queue
              def run(self):
                  for i in range(20):
                      print self.getName(),'adding',i,'to queue'
                      self.sharedata.put(i)
                      time.sleep(random.randrange(10)/10.0)
                  print self.getName(),'Finished'

          # Consumer thread
          class Consumer(threading.Thread):
              def __init__(self, threadname, queue):
                  threading.Thread.__init__(self, name = threadname)
                  self.sharedata = queue
              def run(self):
                  for i in range(20):
                      print self.getName(),'got a value:',self.sharedata.get()
                      time.sleep(random.randrange(10)/10.0)
                  print self.getName(),'Finished'

          # Main thread
          def main():
              queue = Queue()
              producer = Producer('Producer', queue)
              consumer = Consumer('Consumer', queue)

              print 'Starting threads ...'
              producer.start()
              consumer.start()

              producer.join()
              consumer.join()

              print 'All threads have terminated.'

          if __name__ == '__main__':
              main()

              示例代码中实现了两个类:生产者类Producer和消费者类Consumer。前者在一个随机的时间内放入一个值到队列queue中然后显示出来,后者在一定随机的时间内从队列queue中取出一个值并显示出来。



          Trackback: http://tb.donews.net/TrackBack.aspx?PostId=295618


          [点击此处收藏本文]  发表于2005年03月05日 8:49 PM




          正在读取评论……

          发表评论

          大名
          网址
          验证码
          评论