本文实例讲述了Python多线程通信队列队列用法。分享给大家供大家参考,具体如下:
队列:-
<李>什么是队列:是一种特殊的结构,类似于列表。不过就像排队一样,队列中的元素一旦取出,那么就会从队列中删除。李>
<李>线程之间的通信可以使用队列队列来进行李>
<李>线程如何使用queue.Queue【还有其他类型的对象下面讲】来通信:
-
<李> 1。创建一个队列对象:对象=queue.Queue (x), x是队列容量,x可以不填,默认没有容量限制,,,,,李>
<李> 2. get()可以使线程从队列中获取一个元素,如果队列为空,就会等,待会可以设置超时参数,这是等待时间李>
<李> 3. put()可以往队列中放入一个元素【默认队列队列是先入先出的,先放入的元素会先取出去,如果队列满了,把会等待,把可以设置超时参数,这是等待时间李>
<李> 李>
【下例为:发送方线程发送直径给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 ()注:
队列可以有容量限制:
超时的设置:
<人力资源/>
队列的其他相关函数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多线程通信队列队列用法实例分析