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 21 Python
Python中运行并行任务技巧
Feb 26 Python
python中enumerate函数用法实例分析
May 20 Python
python中__slots__用法实例
Jun 04 Python
使用Python判断质数(素数)的简单方法讲解
May 05 Python
Python通过matplotlib画双层饼图及环形图简单示例
Dec 15 Python
解决已经安装requests,却依然提示No module named requests问题
May 18 Python
python判断完全平方数的方法
Nov 13 Python
python爬虫学习笔记之Beautifulsoup模块用法详解
Apr 09 Python
keras之权重初始化方式
May 21 Python
pandas 像SQL一样使用WHERE IN查询条件说明
Jun 05 Python
Python语言中的数据类型-序列
Feb 24 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验证码(支持中文)
2007/02/14 PHP
PHP时间格式控制符对照表分享
2013/07/23 PHP
PHP中COOKIES使用示例
2015/07/26 PHP
Zend Framework教程之Zend_Registry对象用法分析
2016/03/22 PHP
PHP页面跳转操作实例分析(header方法)
2016/09/28 PHP
PHP 实现 JSON 数据的编码和解码操作详解
2020/04/22 PHP
IE浏览器兼容Firefox的JS脚本的代码
2008/10/23 Javascript
javascript this用法小结
2008/12/19 Javascript
基于jquery的拖动布局插件
2011/11/25 Javascript
js鼠标滑过弹出层的定位IE6bug解决办法
2012/12/26 Javascript
给Flash加一个超链接(推荐使用透明层)兼容主流浏览器
2013/06/09 Javascript
解决jquery插件冲突的问题
2014/01/23 Javascript
Jquery获得控件值的三种方法总结
2014/02/13 Javascript
jQuery定义背景动态切换效果的方法
2015/03/23 Javascript
AngularJS基础 ng-selected 指令简单示例
2016/08/03 Javascript
bootstrap table之通用方法( 时间控件,导出,动态下拉框, 表单验证 ,选中与获取信息)代码分享
2017/01/24 Javascript
微信小程序使用image组件显示图片的方法【附源码下载】
2017/12/08 Javascript
vue实现element-ui对话框可拖拽功能
2018/08/17 Javascript
layui自定义验证,用ajax查询后台是否有重复数据,form.verify的例子
2019/09/06 Javascript
layer.prompt输入层的例子
2019/09/24 Javascript
Python常用的文件及文件路径、目录操作方法汇总介绍
2015/05/21 Python
python实现自动发送邮件发送多人、群发、多附件的示例
2018/01/23 Python
ubuntu安装mysql pycharm sublime
2018/02/20 Python
Python3中_(下划线)和__(双下划线)的用途和区别
2019/04/26 Python
python scipy卷积运算的实现方法
2019/09/16 Python
python实现贪吃蛇游戏源码
2020/03/21 Python
pyinstaller打包成无控制台程序时运行出错(与popen冲突的解决方法)
2020/04/15 Python
python 实现弹球游戏的示例代码
2020/11/17 Python
python3中确保枚举值代码分析
2020/12/02 Python
Intersport西班牙:在线体育商店
2019/11/06 全球购物
科技开发中心办公室主任岗位责任制
2014/02/10 职场文书
求职简历自我评价怎么写
2015/03/10 职场文书
有关骆驼祥子的读书笔记
2015/06/26 职场文书
pytorch中的numel函数用法说明
2021/05/13 Python
MySQL系列之九 mysql查询缓存及索引
2021/07/02 MySQL
使用RedisTemplat实现简单的分布式锁
2021/11/20 Redis