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保存网页上的图片或者保存页面为截图
Mar 05 Python
Python批处理删除和重命名文件夹的实例
Jul 11 Python
Python实现多线程的两种方式分析
Aug 29 Python
Python线程下使用锁的技巧分享
Sep 13 Python
Python基于Tkinter模块实现的弹球小游戏
Dec 27 Python
python射线法判断检测点是否位于区域外接矩形内
Jun 28 Python
django 微信网页授权认证api的步骤详解
Jul 30 Python
Python中*args和**kwargs的区别详解
Sep 17 Python
在Python中字符串、列表、元组、字典之间的相互转换
Nov 15 Python
Python API 操作Hadoop hdfs详解
Jun 06 Python
python spilt()分隔字符串的实现示例
May 21 Python
2021年最新用于图像处理的Python库总结
Jun 15 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下用rmdir实现删除目录的三种方法小结
2008/04/20 PHP
图片onload事件触发问题解决方法
2011/07/31 Javascript
Extjs4 GridPanel的主要配置参数详细介绍
2013/04/18 Javascript
ListBox实现上移,下移,左移,右移的简单实例
2014/02/13 Javascript
JS+CSS实现可拖动的弹出提示框
2015/02/16 Javascript
Underscore.js常用方法总结
2015/02/28 Javascript
JS基于VML技术实现的五角星礼花效果代码
2015/10/26 Javascript
jquery利用json实现页面之间传值的实例解析
2016/12/12 Javascript
jQuery插件artDialog.js使用与关闭方法示例
2017/10/09 jQuery
浅谈Koa服务限流方法实践
2017/10/23 Javascript
详解ES6语法之可迭代协议和迭代器协议
2018/01/13 Javascript
详解小程序原生使用ES7 async/await语法
2018/08/06 Javascript
vue学习笔记五:在vue项目里面使用引入公共方法详解
2019/04/04 Javascript
vscode 使用Prettier插件格式化配置使用代码详解
2020/08/10 Javascript
原生JavaScript实现轮播图
2021/01/10 Javascript
python基础教程之类class定义使用方法
2014/02/20 Python
Python中logging模块的用法实例
2014/09/29 Python
Python 循环语句之 while,for语句详解
2018/04/23 Python
详解Django中CBV(Class Base Views)模型源码分析
2019/02/25 Python
python匿名函数的使用方法解析
2019/10/10 Python
python装饰器的特性原理详解
2019/12/25 Python
解决Keras使用GPU资源耗尽的问题
2020/06/22 Python
Python利用matplotlib绘制散点图的新手教程
2020/11/05 Python
三星印度官网:Samsung印度
2019/08/03 全球购物
Envie de Fraise意大利:法国网上推出的孕妇装品牌
2020/10/18 全球购物
行政总经理岗位职责
2013/12/05 职场文书
国际贸易专业个人鉴定
2014/02/22 职场文书
学生会副主席竞聘书
2014/03/31 职场文书
《庐山的云雾》教学反思
2014/04/22 职场文书
《美丽的丹顶鹤》教学反思
2014/04/22 职场文书
学习型党组织建设经验材料
2014/05/26 职场文书
个人借款协议书范本
2014/11/17 职场文书
汽车转让协议书范本
2014/12/07 职场文书
javascript之Object.assign()的痛点分析
2022/03/03 Javascript
小喇叭开始广播了! 四十多年前珍贵老照片
2022/05/09 无线电
oracle delete误删除表数据后如何恢复
2022/06/28 Oracle