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创建列表并给列表赋初始值的方法
Jul 28 Python
基于Python实现对PDF文件的OCR识别
Aug 05 Python
python字符串过滤性能比较5种方法
Jun 22 Python
Python编程给numpy矩阵添加一列方法示例
Dec 04 Python
python3利用ctypes传入一个字符串类型的列表方法
Feb 12 Python
Python3模拟curl发送post请求操作示例
May 03 Python
python3 pygame实现接小球游戏
May 14 Python
PyCharm专业最新版2019.1安装步骤(含激活码)
Oct 09 Python
python命令 -u参数用法解析
Oct 24 Python
jupyter notebook 多行输出实例
Apr 09 Python
python产生模拟数据faker库的使用详解
Nov 04 Python
python中requests库+xpath+lxml简单使用
Apr 29 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
phpmyadmin3 安装配置图解教程
2012/03/29 PHP
基于php实现随机合并数组并排序(原排序)
2015/11/26 PHP
php ActiveMQ的安装与使用方法图文教程
2020/02/23 PHP
Jquery 获得服务器控件值的方法小结
2010/05/11 Javascript
High Performance JavaScript(高性能JavaScript)读书笔记分析
2011/05/05 Javascript
jquery的checkbox,radio,select等方法小结
2016/08/30 Javascript
jQuery动态修改字体大小的方法【测试可用】
2016/09/09 Javascript
iOS和Android用同一个二维码实现跳转下载链接的方法
2016/09/28 Javascript
微信小程序中单位rpx和rem的使用
2016/12/06 Javascript
JS字符串长度判断,超出进行自动截取的实例(支持中文)
2017/03/06 Javascript
JS滚动到指定位置导航栏固定顶部
2017/07/03 Javascript
WebStorm ES6 语法支持设置&babel使用及自动编译(详解)
2017/09/08 Javascript
vue Tab切换以及缓存页面处理的几种方式
2019/11/05 Javascript
基于JS实现table导出Excel并保留样式
2020/05/19 Javascript
jQuery是用来干什么的 jquery其实就是一个js框架
2021/02/04 jQuery
Python编程求质数实例代码
2018/01/31 Python
Python3自动签到 定时任务 判断节假日的实例
2018/11/13 Python
django使用haystack调用Elasticsearch实现索引搜索
2019/07/24 Python
python函数参数(必须参数、可变参数、关键字参数)
2019/08/16 Python
python 魔法函数实例及解析
2019/09/25 Python
python获取全国城市pm2.5、臭氧等空气质量过程解析
2019/10/12 Python
浅析Python中字符串的intern机制
2020/10/03 Python
如何通过python检查文件是否被占用
2020/12/18 Python
荷兰网上鞋店:Ziengs.nl
2017/01/02 全球购物
Mansur Gavriel官网:纽约市的一个设计品牌
2019/05/02 全球购物
高中生自我评语大全
2014/01/19 职场文书
上课睡觉检讨书
2014/01/28 职场文书
元旦标语大全
2014/10/09 职场文书
三方协议书
2015/01/27 职场文书
体育活动总结
2015/02/04 职场文书
《1942》观后感
2015/06/08 职场文书
2017新年晚会开幕词
2016/03/03 职场文书
2019让人心动的商业计划书
2019/06/27 职场文书
详解JavaScript中的执行上下文及调用堆栈
2021/04/29 Javascript
pytorch--之halfTensor的使用详解
2021/05/24 Python
PO模式在selenium自动化测试框架的优势
2022/03/20 Python