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里大整数相乘相关技巧指南
Sep 12 Python
Python itertools模块详解
May 09 Python
Python中每次处理一个字符的5种方法
May 21 Python
简单实现python收发邮件功能
Jan 05 Python
python 实现语音聊天机器人的示例代码
Dec 02 Python
python使用for循环计算0-100的整数的和方法
Feb 01 Python
详解Python绘图Turtle库
Oct 12 Python
python使用pandas抽样训练数据中某个类别实例
Feb 28 Python
Python手动或自动协程操作方法解析
Jun 22 Python
Python3 用什么IDE开发工具比较好
Nov 28 Python
Python读取图像并显示灰度图的实现
Dec 01 Python
使用Python+OpenCV进行卡类型及16位卡号数字的OCR功能
Aug 30 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 foreach 使用&(与运算符)引用赋值要注意的问题
2010/02/16 PHP
修改destoon会员公司的伪静态中的com目录的方法
2014/08/21 PHP
Sublime里直接运行PHP配置方法
2014/11/28 PHP
jquery图片轮播特效代码分享
2020/04/20 Javascript
分享有关jQuery中animate、slide、fade等动画的连续触发、滞后反复执行的bug
2016/01/10 Javascript
jQuery flip插件实现的翻牌效果示例【附demo源码下载】
2016/09/20 Javascript
详解js数组的完全随机排列算法
2016/12/16 Javascript
关于Sequelize连接查询时inlude中model和association的区别详解
2017/02/27 Javascript
React Form组件的实现封装杂谈
2018/05/07 Javascript
vue2.0 使用element-ui里的upload组件实现图片预览效果方法
2018/09/04 Javascript
浅谈angular2子组件的事件传递(任意组件事件传递)
2018/09/30 Javascript
JSON生成Form表单的方法示例
2018/11/21 Javascript
vue-router源码之history类的浅析
2019/05/21 Javascript
jQuery设置下拉框显示与隐藏效果的方法分析
2019/09/15 jQuery
JavaScript鼠标拖拽事件详解
2020/04/03 Javascript
[07:57]DOTA2热力大趴狂欢夜 广州站活动回顾
2013/11/27 DOTA
[03:36]DOTA2完美大师赛coL战队趣味视频——我演你猜
2017/11/23 DOTA
[59:35]DOTA2-DPC中国联赛定级赛 Aster vs DLG BO3第一场 1月8日
2021/03/11 DOTA
Python实例之wxpython中Frame使用方法
2014/06/09 Python
Python while 循环使用的简单实例
2016/06/08 Python
Python中循环后使用list.append()数据被覆盖问题的解决
2018/07/01 Python
python中reader的next用法
2018/07/24 Python
PyCharm的设置方法和第一个Python程序的建立
2019/01/16 Python
html5视频常用API接口的实战示例
2020/03/20 HTML / CSS
Coccinelle官网:意大利的著名皮具品牌
2019/05/15 全球购物
Mountain Warehouse波兰官方网站:英国户外品牌
2019/08/29 全球购物
static全局变量与普通的全局变量有什么区别
2014/05/27 面试题
自荐信格式的六要素
2013/09/21 职场文书
乳制品整治工作方案
2014/05/29 职场文书
离婚协议书怎样才有法律效力
2014/10/10 职场文书
实习单位鉴定意见
2015/06/04 职场文书
党员廉政准则心得体会
2016/01/20 职场文书
[有人@你]你有一封绿色倡议书,请查收!
2019/07/18 职场文书
pytorch中的model.eval()和BN层的使用
2021/05/22 Python
一文弄懂MySQL索引创建原则
2022/02/28 MySQL
如何通过简单的代码描述Angular父组件、子组件传值
2022/04/07 Javascript