Python多线程和队列操作实例


Posted in Python onJune 21, 2015

Python3,开一个线程,间隔1秒把一个递增的数字写入队列,再开一个线程,从队列中取出数字并打印到终端

#! /usr/bin/env python3
import time

import threading

import queue
# 一个线程,间隔一定的时间,把一个递增的数字写入队列

# 生产者

class Producer(threading.Thread):
    def __init__(self, work_queue):

        super().__init__() # 必须调用

        self.work_queue = work_queue

        

    def run(self):

        num = 1

        while True:

            self.work_queue.put(num)

            num = num+1

            time.sleep(1) # 暂停1秒
# 一个线程,从队列取出数字,并显示到终端

class Printer(threading.Thread):
    def __init__(self, work_queue):

        super().__init__() # 必须调用

        self.work_queue = work_queue
    def run(self):

        while True:

            num = self.work_queue.get() # 当队列为空时,会阻塞,直到有数据

            print(num)
def main():

    work_queue = queue.Queue()
    producer = Producer(work_queue)

    producer.daemon = True # 当主线程退出时子线程也退出

    producer.start()
    printer = Printer(work_queue)

    printer.daemon = True # 当主线程退出时子线程也退出

    printer.start()
    work_queue.join() # 主线程会停在这里,直到所有数字被get(),并且task_done(),因为没有调用task_done(),所在这里会一直阻塞,直到用户按^C
if __name__ == '__main__':

    main()

queue是线程安全的,从多个线程访问时无需加锁。
如果在work_queue.get()之后调用work_queue.task_done(),那么在队列空时work_queue.join()会返回。
这里work_queue.put()是间隔一定时间才往队列放东西,如果调用work_queue.task_done(),在数字1被get()后,队列空时,join()就返回,程序就结束了。
也就是程序只打印了1然后就退出了。
所以在这种使用情景下,不能调用task_done(),程序会一直循环下去。
https://docs.python.org/3/library/queue.html
Python 相关文章推荐
使用python调用浏览器并打开一个网址的例子
Jun 05 Python
python用reduce和map把字符串转为数字的方法
Dec 19 Python
Python实现将16进制字符串转化为ascii字符的方法分析
Jul 21 Python
Python3编程实现获取阿里云ECS实例及监控的方法
Aug 18 Python
python探索之BaseHTTPServer-实现Web服务器介绍
Oct 28 Python
python 通过字符串调用对象属性或方法的实例讲解
Apr 21 Python
完美解决Pycharm无法导入包的问题 Unresolved reference
May 18 Python
说说如何遍历Python列表的方法示例
Feb 11 Python
Python3列表内置方法大全及示例代码小结
May 10 Python
关于Pytorch MaxUnpool2d中size操作方式
Jan 03 Python
关于Theano和Tensorflow多GPU使用问题
Jun 19 Python
python如何正确使用yield
May 21 Python
Python中type的构造函数参数含义说明
Jun 21 #Python
Python base64编码解码实例
Jun 21 #Python
python在控制台输出进度条的方法
Jun 20 #Python
python压缩文件夹内所有文件为zip文件的方法
Jun 20 #Python
Python写的一个简单监控系统
Jun 19 #Python
详解Python中的日志模块logging
Jun 19 #Python
使用httplib模块来制作Python下HTTP客户端的方法
Jun 19 #Python
You might like
excellent!――ASCII Art(由目标图象生成ascii)
2007/02/20 PHP
PHP SPL标准库之接口(Interface)详解
2015/05/11 PHP
对于Laravel 5.5核心架构的深入理解
2018/02/22 PHP
JavaScript 权威指南(第四版) 读书笔记
2009/08/11 Javascript
js中top、clientTop、scrollTop、offsetTop的区别 文字详细说明版
2011/01/08 Javascript
在jQuery中 常用的选择器介绍
2013/04/16 Javascript
ie中js创建checkbox默认选中问题探讨
2013/10/21 Javascript
返回顶部按钮响应滚动且动态显示与隐藏
2014/10/14 Javascript
JQuery中DOM事件合成用法实例分析
2015/06/13 Javascript
JQuery之proxy实现绑定代理方法
2016/08/01 Javascript
JavaScript将DOM事件处理程序封装为event.js 出现的低级错误问题
2016/08/03 Javascript
jQuery插件FusionWidgets实现的Cylinder图效果示例【附demo源码】
2017/03/23 jQuery
JavaScript实现兼容IE6的收起折叠与展开效果实例
2017/09/20 Javascript
javascript用rem来做响应式开发
2018/01/13 Javascript
Angular 向组件传递模板的两种方法
2018/02/23 Javascript
jquery获取并修改触发事件的DOM元素示例【基于target 属性】
2019/10/10 jQuery
javascript局部自定义鼠标右键菜单
2020/12/08 Javascript
[00:20]TI9不朽观赛名额抽取
2019/08/05 DOTA
python用于url解码和中文解析的小脚本(python url decoder)
2013/08/11 Python
Python3.6.2调用ffmpeg的方法
2019/01/10 Python
python实现两张图片的像素融合
2019/02/23 Python
Python图片的横坐标汉字实例
2019/12/04 Python
Python GUI编程学习笔记之tkinter事件绑定操作详解
2020/03/30 Python
django rest framework serializers序列化实例
2020/05/13 Python
基于tensorflow for循环 while循环案例
2020/06/30 Python
python实现数字炸弹游戏程序
2020/07/17 Python
Python爬虫之Spider类用法简单介绍
2020/08/04 Python
2014年商场超市庆元旦活动方案
2014/02/14 职场文书
工程类专业自荐信范文
2014/03/09 职场文书
农民工预备党员思想汇报
2014/09/14 职场文书
物价局领导班子四风问题整改措施
2014/10/26 职场文书
党委班子纠正“四风”问题整改措施
2014/10/28 职场文书
汽车修理厂管理制度
2015/08/05 职场文书
2016教师六五普法学习心得体会
2016/01/21 职场文书
高三化学教学反思
2016/02/22 职场文书
mysql 获取时间方式
2022/03/20 MySQL