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连接池实现示例程序
Nov 26 Python
Python中replace方法实例分析
Aug 20 Python
跟老齐学Python之让人欢喜让人忧的迭代
Oct 02 Python
详解Python中的Numpy、SciPy、MatPlotLib安装与配置
Nov 17 Python
Python多线程同步---文件读写控制方法
Feb 12 Python
python实现维吉尼亚算法
Mar 20 Python
解决Django migrate不能发现app.models的表问题
Aug 31 Python
在Python中利用pickle保存变量的实例
Dec 30 Python
在 Python 中接管键盘中断信号的实现方法
Feb 04 Python
Python获取、格式化当前时间日期的方法
Feb 10 Python
python pyqtgraph 保存图片到本地的实例
Mar 14 Python
pip install命令安装扩展库整理
Mar 02 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
模拟xcopy的函数
2006/10/09 PHP
php session 预定义数组
2009/03/16 PHP
php文件上传、下载和删除示例
2020/08/28 PHP
php面向对象程序设计入门教程
2019/06/22 PHP
Gambit vs CL BO3 第二场 2.13
2021/03/10 DOTA
Javascript实例教程(19) 使用HoTMetal(3)
2006/12/23 Javascript
不间断滚动JS打包类,基本可以实现所有的滚动效果,太强了
2007/12/08 Javascript
javascript一点特殊用法
2008/05/28 Javascript
百度留言本js 大家可以参考下
2009/10/13 Javascript
js拖动div 当鼠标移动时整个div也相应的移动
2013/11/21 Javascript
深入理解JavaScript系列(43):设计模式之状态模式详解
2015/03/04 Javascript
JS设置cookie、读取cookie、删除cookie
2015/04/17 Javascript
jQuery根据元素值删除数组元素的方法
2015/06/24 Javascript
Bootstrap被封装的弹层
2016/07/20 Javascript
vue.js实现表格合并示例代码
2016/11/30 Javascript
Bootstrap导航条学习使用(一)
2017/02/08 Javascript
js实现点击切换checkbox背景图片的简单实例
2017/05/08 Javascript
node.js 核心http模块,起一个服务器,返回一个页面的实例
2017/09/11 Javascript
vue中引入第三方字体文件的方法示例
2018/12/17 Javascript
NodeJS多种创建WebSocket监听的方式(三种)
2020/06/04 NodeJs
python提取字典key列表的方法
2015/07/11 Python
Python爬虫工程师面试问题总结
2018/03/22 Python
Pandas 合并多个Dataframe(merge,concat)的方法
2018/06/08 Python
jupyter notebook插入本地图片的实现
2020/04/13 Python
python 比较字典value的最大值的几种方法
2020/04/17 Python
解决selenium+Headless Chrome实现不弹出浏览器自动化登录的问题
2021/01/09 Python
使用数据结构给女朋友写个Html5走迷宫游戏
2019/11/26 HTML / CSS
美国五金商店:Ace Hardware
2018/03/27 全球购物
澳大利亚最好的电动自行车:Leon Cycle
2020/12/19 全球购物
什么是跨站脚本攻击
2014/12/11 面试题
写给学生的新学期寄语
2014/01/18 职场文书
即将毕业大学生自荐信
2014/01/24 职场文书
倡议书格式
2014/04/14 职场文书
2016年大学生党员公开承诺书
2016/03/24 职场文书
javascript的var与let,const之间的区别详解
2022/02/18 Javascript
如何优化vue打包文件过大
2022/04/13 Vue.js