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列表去重的二种方法
Feb 14 Python
Python实现扫描指定目录下的子目录及文件的方法
Jul 16 Python
总结用Pdb库调试Python的方式及常用的命令
Aug 18 Python
Python 文本文件内容批量抽取实例
Dec 10 Python
Python 一句话生成字母表的方法
Jan 02 Python
Tensorflow实现酸奶销量预测分析
Jul 19 Python
python爬虫 Pyppeteer使用方法解析
Sep 28 Python
Python Django模板之模板过滤器与自定义模板过滤器示例
Oct 18 Python
如何在python中实现随机选择
Nov 02 Python
Pandas —— resample()重采样和asfreq()频度转换方式
Feb 26 Python
python3.7调试的实例方法
Jul 21 Python
使用Python制作一盏 3D 花灯喜迎元宵佳节
Feb 26 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
PHP开发中常用的8个小技巧
2008/08/27 PHP
深入理解php的MySQL连接类
2013/06/07 PHP
深入php self与$this的详解
2013/06/08 PHP
php实现的DateDiff和DateAdd时间函数代码分享
2014/08/16 PHP
PHP如何实现阿里云短信sdk灵活应用在项目中的方法
2019/06/14 PHP
如何设置iframe高度自适应在跨域情况下的可用方法
2013/09/06 Javascript
js操作table示例(个人心得)
2013/11/29 Javascript
AngularJS  $modal弹出框实例代码
2016/08/24 Javascript
简单的js表格操作
2016/09/24 Javascript
详解Angular中的自定义服务Service、Provider以及Factory
2017/04/22 Javascript
解决ztree搜索中多级菜单展示不全问题
2017/07/05 Javascript
karma+webpack搭建vue单元测试环境的方法示例
2018/05/24 Javascript
Vue在页面数据渲染完成之后的调用方法
2018/09/11 Javascript
微信小程序新手教程之启动页的重要性
2019/03/03 Javascript
JS重学系列之聊聊new操作符
2019/03/04 Javascript
解决layui laydate 时间控件一闪而过的问题
2019/09/28 Javascript
element-ui中dialog弹窗关闭按钮失效的解决
2020/09/22 Javascript
[01:35:13]DOTA2-DPC中国联赛 正赛 DLG vs PHOENIX BO3 第一场 1月18日
2021/03/11 DOTA
python3.0 字典key排序
2008/12/24 Python
在Mac OS上使用mod_wsgi连接Python与Apache服务器
2015/12/24 Python
python发送邮件实例分享
2017/07/28 Python
python和shell获取文本内容的方法
2018/06/05 Python
python中正则表达式与模式匹配
2019/05/07 Python
Django中在xadmin中集成DjangoUeditor过程详解
2019/07/24 Python
利用pandas合并多个excel的方法示例
2019/10/10 Python
Django Admin后台模型列表页面如何添加自定义操作按钮
2020/11/11 Python
英国领先的维生素和营养补充剂直接供应商:Healthspan
2019/04/22 全球购物
新西兰购物网站:TheMarket NZ
2020/09/19 全球购物
介绍一下#error预处理
2015/09/25 面试题
仓库管理专业个人自我评价范文
2013/11/11 职场文书
搞笑征婚广告词
2014/03/17 职场文书
《晚上的太阳》教学反思
2014/04/23 职场文书
大学生活动总结模板
2014/07/02 职场文书
含预算的公司户外活动方案
2014/08/16 职场文书
贷款收入证明范本
2015/06/12 职场文书
简单实现一个手持弹幕功能+文字抖动特效
2021/03/31 HTML / CSS