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 03 Python
python实现多线程的两种方式
May 22 Python
Python设计模式之代理模式简单示例
Jan 09 Python
使用python编写udp协议的ping程序方法
Apr 22 Python
matplotlib savefig 保存图片大小的实例
May 24 Python
uwsgi+nginx部署Django项目操作示例
Dec 04 Python
pytorch:model.train和model.eval用法及区别详解
Feb 20 Python
基于Django OneToOneField和ForeignKey的区别详解
Mar 30 Python
150行Python代码实现带界面的数独游戏
Apr 04 Python
Python 如何展开嵌套的序列
Aug 01 Python
基于Python实现天天酷跑功能
Jan 06 Python
简述python四种分词工具,盘点哪个更好用?
Apr 13 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中日期加减法运算实现代码
2011/12/08 PHP
php获取YouTube视频信息的方法
2015/02/11 PHP
PHP SPL标准库中的常用函数介绍
2015/05/11 PHP
ThinkPHP3.2框架操作Redis的方法分析
2019/05/05 PHP
JavaScript NaN和Infinity特殊值 [译]
2012/09/20 Javascript
js实现目录定位正文示例
2013/11/14 Javascript
使用jQuery和Bootstrap实现多层、自适应模态窗口
2014/12/22 Javascript
NodeJS学习笔记之Connect中间件应用实例
2015/01/27 NodeJs
js常用DOM方法详解
2017/02/04 Javascript
史上最全JavaScript常用的简写技巧(推荐)
2017/08/17 Javascript
浅谈Vuex的状态管理(全家桶)
2017/11/04 Javascript
node基于puppeteer模拟登录抓取页面的实现
2018/05/09 Javascript
JavaScript实现异步图像上传功能
2018/07/12 Javascript
微信小程序实现点赞、取消点赞功能
2018/11/02 Javascript
原来JS还可以这样拆箱转换详解
2019/02/01 Javascript
vue-router两种模式区别及使用注意事项详解
2019/08/01 Javascript
在Layui 的表格模板中,实现layer父页面和子页面传值交互的方法
2019/09/10 Javascript
JS多个异步请求 按顺序执行next实现解析
2019/09/16 Javascript
jquery 键盘事件 keypress() keydown() keyup()用法总结
2019/10/23 jQuery
JS中比较两个Object数组是否相等方法实例
2019/11/11 Javascript
[57:22]2018DOTA2亚洲邀请赛 4.7总决赛 LGD vs Mineski 第五场
2018/04/10 DOTA
Python兔子毒药问题实例分析
2015/03/05 Python
python ansible服务及剧本编写
2017/12/29 Python
基于python的多进程共享变量正确打开方式
2018/04/28 Python
使用Python监控文件内容变化代码实例
2018/06/04 Python
对Python3中dict.keys()转换成list类型的方法详解
2019/02/03 Python
详解Django+uwsgi+Nginx上线最佳实战
2019/03/14 Python
Python Sympy计算梯度、散度和旋度的实例
2019/12/06 Python
Django如何批量创建Model
2020/09/01 Python
教学大赛获奖感言
2014/01/15 职场文书
秋季校运动会广播稿
2014/02/23 职场文书
2014年公司迎新年活动方案
2014/02/24 职场文书
群众路线教育实践活动思想汇报(2014特荐篇)
2014/09/16 职场文书
习总书记三严三实学习心得体会
2014/10/13 职场文书
2015年扫黄打非工作总结
2015/05/13 职场文书
河童之夏观后感
2015/06/11 职场文书