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实现在sqlite动态创建表的方法
May 08 Python
Python 绘图和可视化详细介绍
Feb 11 Python
Tensorflow之构建自己的图片数据集TFrecords的方法
Feb 07 Python
python写入已存在的excel数据实例
May 03 Python
Python cv2 图像自适应灰度直方图均衡化处理方法
Dec 07 Python
对python 自定义协议的方法详解
Feb 13 Python
Python flask框架post接口调用示例
Jul 03 Python
python 实现在shell窗口中编写print不向屏幕输出
Feb 19 Python
浅谈django 重载str 方法
May 19 Python
Python判断变量是否是None写法代码实例
Oct 09 Python
Python实战之OpenCV实现猫脸检测
Jun 26 Python
Python Django模型详解
Oct 05 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 函数语法介绍一
2009/06/14 PHP
php设计模式 Command(命令模式)
2011/06/26 PHP
php入门学习知识点四 PHP正则表达式基本应用
2011/07/14 PHP
解析CI即CodeIgniter框架在Nginx下的重写规则
2013/06/03 PHP
Codeigniter实现处理用户登录验证后的URL跳转
2014/06/12 PHP
10个对初学者非常有用的PHP技巧
2016/04/06 PHP
PHP面相对象中的重载与重写
2017/02/13 PHP
Thinkphp5行为使用方法汇总
2017/12/21 PHP
PHP实现单条sql执行多个数据的insert语句方法
2019/10/11 PHP
统一接口:为FireFox添加IE的方法和属性的js代码
2007/03/25 Javascript
JavaScript Chart 插件整理
2010/06/18 Javascript
js Event对象的5种坐标
2011/09/12 Javascript
禁用页面部分JavaScript方法的具体实现
2013/07/31 Javascript
js光标定位文本框回车表单提交问题的解决方法
2015/05/11 Javascript
JavaScript中停止执行setInterval和setTimeout事件的方法
2015/05/14 Javascript
jquery用ajax方式从后台获取json数据后如何将内容填充到下拉列表
2015/08/26 Javascript
ES6新特性一: let和const命令详解
2017/04/20 Javascript
JS HTML图片显示Canvas 压缩功能
2017/07/21 Javascript
vue .js绑定checkbox并获取、改变选中状态的实例
2018/08/24 Javascript
微信小程序文章详情页面实现代码
2018/09/10 Javascript
原生JavaScript实现轮播图
2021/01/10 Javascript
vue如何使用rem适配
2021/02/06 Vue.js
[01:02:10]DOTA2上海特级锦标赛B组小组赛#2 VG VS Fnatic第一局
2016/02/26 DOTA
[03:59]第二届DOTA2亚洲邀请赛选手传记-VGJ.rOtk
2017/04/03 DOTA
跟老齐学Python之类的细节
2014/10/13 Python
python数组过滤实现方法
2015/07/27 Python
Python 实现文件的全备份和差异备份详解
2016/12/27 Python
[原创]教女朋友学Python(一)运行环境搭建
2017/11/29 Python
Python判断一个文件夹内哪些文件是图片的实例
2018/12/07 Python
python opencv将图片转为灰度图的方法示例
2019/07/31 Python
Python文件操作函数用法实例详解
2019/12/24 Python
12个不为大家熟知的HTML5设计小技巧
2016/06/02 HTML / CSS
校园公益广告语
2014/03/13 职场文书
民政局离婚协议书范本
2014/10/20 职场文书
vue3种table表格选项个数的控制方法
2022/04/14 Vue.js
解决Mysql报错 Table 'mysql.user' doesn't exist
2022/05/06 MySQL