Python多线程通信队列队列用法实例分析

  

本文实例讲述了Python多线程通信队列队列用法。分享给大家供大家参考,具体如下:

  队列:

  
      <李>什么是队列:是一种特殊的结构,类似于列表。不过就像排队一样,队列中的元素一旦取出,那么就会从队列中删除。   <李>线程之间的通信可以使用队列队列来进行   <李>线程如何使用queue.Queue【还有其他类型的对象下面讲】来通信:   
        <李> 1。创建一个队列对象:对象=queue.Queue (x), x是队列容量,x可以不填,默认没有容量限制,,,,,李   <李> 2. get()可以使线程从队列中获取一个元素,如果队列为空,就会等,待会可以设置超时参数,这是等待时间李   <李> 3. put()可以往队列中放入一个元素【默认队列队列是先入先出的,先放入的元素会先取出去,如果队列满了,把会等待,把可以设置超时参数,这是等待时间李   <李>  Python多线程通信队列队列用法实例分析   
      李   
  

【下例为:发送方线程发送直径给recvder线程,recvder计算得出周长】

        进口螺纹、时间、队列,随机的   def发送方():#发件人发送直径   而真正的:   x=random.randint (10)   打印(“发送完成:“x)   q.put (x) #每个一秒就放入一个随机数   time . sleep(1) #每隔一秒就放入一个      def recvder (): # recvder计算周长   而真正的:   x=q.get ()   打印(“recv做:“x * 3.14) #每隔一秒就取出一个元素,计算结果   time . sleep (1)      q=queue.Queue ()   t1=threading.Thread(目标=发送者)   t2=threading.Thread(目标=recvder)      t1.start ()   t2.start ()      t1.join ()   t2.join ()      
      <李>队列对象已经包含了必要的锁,所以不用担心会出错李   
        进口螺纹、时间、队列,随机的   def发送方():#发件人发送直径   而真正的:   x=random.randint (10)   打印(“发送完成:“x)   q.put (x) #每个一秒就放入一个随机数   time . sleep(1) #每隔一秒就放入一个      def recvder (): # recvder计算周长   而真正的:   x=q.get ()   print (threading.current_thread (),“recv做:“x * 3.14) #每隔一秒就取出一个元素,计算结果   time . sleep (2)         q=queue.Queue ()   t1=threading.Thread(目标=发送者)   t2=threading.Thread(目标=recvder)   t3=threading.Thread(目标=recvder)      t1.start ()   t2.start ()   t3.start ()      t1.join ()   t2.join ()   t3.join ()      注:

  

队列可以有容量限制:

  

 Python多线程通信队列队列用法实例分析

  

超时的设置:

  

 Python多线程通信队列队列用法实例分析

  <人力资源/>   

队列的其他相关函数q【设为一个队列对象】:

  
      <李> q.qsize():返回当前队列的元素个数   <李> q.empty():判断队列是否空,返回布尔值   <李> q.full():判断队列是否满,返回布尔值   
  
      <李> q.get_nowait():直接使用(),如果此时队列中没有元素,那么会阻塞等待,使用get_nowait()后,如果队列中没有元素,那么会报错李   <李> q.put_nowait():直接使用(),如果此时队列满了,那么会阻塞等待,使用put_nowait()后,如果队列已经满了,那么会报错李   
  
      <李> q.task_done():在完成一项工作之后,task_done()函数向任务已经完成的队列发送一个信号【功能类似于:有一个只能承重一个人的独木桥,一个来了发现B在桥上,所以一个不能上桥,他就在等,等到B过完桥后喊一下他,他才知道B过完桥了】【q.task_done主要是跟q.join()配合使用的】李   <李> q.join():实际上意味着等到队列为空,再执行别的操作【每次得到后需要调用task_done,直到所有队列为空,这时才会执行加入下面的】李   
        进口线程队列,时间   ”“”   这个例子是:厂家跟司机约定,生产满3个,司机才来拉,   而一个个拉走,只有当3个都拉走,厂家才继续生产   ”“”   def生产商():#厂家   而真正的:   因为我在范围(3):   q.put(我)   start_time=time.time ()   q.join() # #结果显示加入这里堵塞住了厂家线程   打印(“等待时间:“,time.time () -start_time) #用来测试是否堵塞,证明不是因为司机的睡眠堵塞运行         def司机():#老司机   而真正的:   因为我在范围(3):   print (q.get ())   q.task_done ()   打印(" ")   time . sleep (2)         q=queue.Queue ()   t1=threading.Thread(目标=生产商)   目标=t2=threading.Thread(司机)      t1.start ()   t2.start ()      t1.join ()   t2.join ()

Python多线程通信队列队列用法实例分析