# -*- coding: UTF-8 -*-
"""
多线程同时读队列
使用 join(), task_done() 逻辑:
3个子线程并发 从有6个数据的队列中取数据,并且打印出来。
主线程等待队列空了才结束 总结:
1、主线程 调用 q.join()等待队列为空时,应该不是根据 q.qsize()判断的
也就是在Queue设计上,q.qsize()操作的内部队列大小变量 和 task_done()操作的内部队列大小变量
不是同一个 使用:
1、正常创建队列,往队列中读写数据
2、在线程处理完一个队列数据后加上 q.task_done()
3、在主线程中执行 q.join() 资料:
Queue.task_done() 在完成一项工作之后,Queue.task_done()函数向任务已经完成的队列发送一个信号
Queue.join() 实际上意味着等到队列为空,再执行别的操作
如果线程里每从队列里取一次,但没有执行task_done(),则join无法判断队列到底有没有结束,在最后执行个join()是等不到结果的,会一直挂起。
可以理解为,每task_done一次 就从队列里删掉一个元素,这样在最后join的时候根据队列长度是否为零来判断队列是否结束,从而执行主线程。 """
import Queue
import threading
import time
import random q = Queue.Queue(0) # 无限大小的队列
NUM_WORKERS = 3 # 线程数量 class MyThread(threading.Thread):
"""从队列读取数据打印""" def __init__(self,queue,threadid):
"""
:param queue: 队列
:param threadid: 线程编号
"""
threading.Thread.__init__(self)
self._jobq = queue
self._threadid = threadid def run(self): ## 每个子线程不断从队列中读取数据,知道队列空才结束
while True:
time.sleep( random.random()*5)
# 获取队列数据
data = None try:
data = self._jobq.get(False) # 队列空,抛出异常
except:
break ## 效果同上
# if self._jobq.qsize()>0:
# data = self._jobq.get()
# else:
# break print "doing", data, " sub_process ", self._threadid
self._jobq.task_done() # 执行发送信号 告诉执行join()等待的线程,队列中又少了一个数据啦 print "sub_process end:",self._threadid if __name__ == '__main__':
print "begin...."
# 往队列写数据
for i in range(NUM_WORKERS * 2):
q.put(i) print "job qsize:",q.qsize() # 启动线程
for x in range(NUM_WORKERS):
MyThread(q,x).start() q.join() # 主线程等待队列空,子线程执行一次task_done(),它就知道队列大小减一了
print "end" """
Out:
begin....
job qsize: 6
doing 0 sub_process 1
doing 1 sub_process 0
doing 2 sub_process 1
doing 3 sub_process 2
doing 4 sub_process 2
doing 5 sub_process 0
end
sub_process end: 1
sub_process end: 2
sub_process end: 0
"""

[b0033] python 归纳 (十八)_队列Queue在多线程中使用(二)的更多相关文章

  1. [b0029] python 归纳 (十四)_队列Queue实现生产者消费者

    # -*- coding: UTF-8 -*- """ 多线程的生产者,消费者 使用队列Queue """ import Queue imp ...

  2. [b0028] python 归纳 (十三)_队列Queue在多线程中使用

    # -*- coding: UTF-8 -*- """ 多线程同时读队列 总结: 1. 会阻塞 if self._jobq.qsize() > 0 进入逻辑,此时被 ...

  3. Python爬虫(十八)_多线程糗事百科案例

    多线程糗事百科案例 案例要求参考上一个糗事百科单进程案例:http://www.cnblogs.com/miqi1992/p/8081929.html Queue(队列对象) Queue是python ...

  4. [b0034] python 归纳 (十九)_线程同步_条件变量

    代码: # -*- coding: utf-8 -*- """ 学习线程同步,使用条件变量 逻辑: 生产消费者模型 一个有3个大小的产品库,一个生产者负责生产,一个消费者 ...

  5. [b0030] python 归纳 (十五)_多进程使用Pool

    1 usePool.py #coding: utf-8 """ 学习进程池使用 multiprocessing.Pool 总结: 1. Pool 池用于处理 多进程,并不 ...

  6. Python笔记(十八)_私有属性、实例属性、类属性

    私有属性 如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__,就变成了一个私有属性,只有内部可以访问,外部不能直接访问或修改. 这样就确保了外部代码不能随意修改对象内部的状态,这样通过 ...

  7. [b0031] python 归纳 (十六)_线程同步_锁

    # -*- coding: utf-8 -*- """ 学习 多线程同步 使用锁 threading.Lock() 逻辑: 2 个线程,操作同一个整型变量,一个加法,另外 ...

  8. [b0027] python 归纳 (十二)_并发队列Queue的使用

    # -*- coding: UTF-8 -*- """ 学习队列 Queue 总结: 1. 队列可以设置大小,也可以无限大小 2. 空了,满了,读写时可以阻塞,也可以报错 ...

  9. BlockingQueue阻塞队列(解决多线程中数据安全问题 可用于抢票,秒杀)

    案例:一个线程类中 private static BlockingQueue<Map<String, String>> dataQueue = new LinkedBlocki ...

随机推荐

  1. 前端Vue准备工作

    环境准备: 1.安装Node&npm,只是为了要Node.js的环境https://nodejs.org/en/download/ 2.安装完成Node以及npm之后,就可以用npm conf ...

  2. WGS84、WebMercator、GCJ02和BD09坐标系简介与转换

    WGS84(GPS): 地心坐标系,空间直角坐标系,原点与地球质心重合,为GPS采用的坐标系,也是目前广泛使用的GPS全球卫星定位系统使用的坐标系. 通过GPS可以直接获取WGS84下的坐标(B,L, ...

  3. 【转载】从使用到原理学习Java线程池

    线程池的技术背景 在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源.在Java中更是如此,虚拟机将试图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收. 所 ...

  4. Spring Boot 2 + jpa + mysql例子

    Spring Data框架为数据访问提供了一个通用的模型,无论访问哪种数据库,都可以使用同样的方式,主要有以下几个功能:(1)提供数据与对象映射的抽象层,同一个对象,可以被映射为不同数据库的数据:(2 ...

  5. 利用phpqrcode二维码生成类库合成带logo的二维码并且用合成的二维码生成海报(二)

    前期准备 引入phpqrcode类库(下载地址:https://download.csdn.net/download/weixin_37557729/11891240:支持彩色二维码的下载地址:htt ...

  6. nvprof 使用记录; 以及使用 nvprof 查看tensorflow-gpu 核函数运行记录

    最近需要使用 nvprof 此时cuda 程序运行的性能,下面对使用过程进行简要记录,进行备忘: 常用使用命令:nvprof --unified-memory-profiling off python ...

  7. vscode 问题。。。。

    "program": "${workspaceFolder}/a.out", "preLaunchTask": "build&qu ...

  8. qtdomdocument找不到

  9. 201871010113-刘兴瑞《面向对象程序设计(java)》第十一周学习总结

    项目 内容 这个作业属于哪个课程 <任课教师博客主页链接> https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 <作业链接地址>htt ...

  10. __doc__

    目录 一.__doc__ 一.__doc__ 返回类的注释信息 class Foo: '我是描述信息' pass print(Foo.__doc__) 我是描述信息 该属性无法被继承 class Fo ...