Python3中多线程编程的队列运作示例


Posted in Python onApril 16, 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(),程序会一直循环下去。

Python 相关文章推荐
介绍Python中的__future__模块
Apr 27 Python
Python2.7基于笛卡尔积算法实现N个数组的排列组合运算示例
Nov 23 Python
pandas获取groupby分组里最大值所在的行方法
Apr 20 Python
python中in在list和dict中查找效率的对比分析
May 04 Python
django admin 后台实现三级联动的示例代码
Jun 22 Python
python中ImageTk.PhotoImage()不显示图片却不报错问题解决
Dec 06 Python
python scatter函数用法实例详解
Feb 11 Python
python获取依赖包和安装依赖包教程
Feb 13 Python
详解Django配置JWT认证方式
May 09 Python
Python生成器next方法和send方法区别详解
May 30 Python
Python Scrapy图片爬取原理及代码实例
Jun 12 Python
Django QuerySet查询集原理及代码实例
Jun 13 Python
使用Python脚本操作MongoDB的教程
Apr 16 #Python
使用Python中的greenlet包实现并发编程的入门教程
Apr 16 #Python
利用Python的Twisted框架实现webshell密码扫描器的教程
Apr 16 #Python
使用Python的Twisted框架实现一个简单的服务器
Apr 16 #Python
使用Python的Twisted框架编写简单的网络客户端
Apr 16 #Python
从Python的源码浅要剖析Python的内存管理
Apr 16 #Python
用Python实现换行符转换的脚本的教程
Apr 16 #Python
You might like
使用淘宝IP库获取用户ip地理位置
2013/10/27 PHP
PHP语法自动检查的Vim插件
2014/08/11 PHP
PHP批量去除BOM头内容信息代码
2016/03/11 PHP
PHP单例模式定义与使用实例详解
2017/02/06 PHP
PHP操作Redis常用技巧总结
2018/04/24 PHP
AJAX架构之Dojo篇
2007/04/10 Javascript
js 禁止选择功能实现代码(兼容IE/Firefox)
2010/04/23 Javascript
js querySelector和getElementById通过id获取元素的区别
2012/04/20 Javascript
JavaScript起点(严格模式深度了解)
2013/01/28 Javascript
JQuery之focus函数使用介绍
2013/08/20 Javascript
jquery插件jquery.LightBox.js实现点击放大图片并左右点击切换效果(附demo源码下载)
2016/02/25 Javascript
微信小程序实现列表下拉刷新上拉加载
2020/07/29 Javascript
详解Axios统一错误处理与后置
2018/09/26 Javascript
利用Vconsole和Fillder进行移动端抓包调试方法
2019/03/05 Javascript
微信小程序实现文件、图片上传功能
2020/08/18 Javascript
[57:09]DOTA2-DPC中国联赛 正赛 Phoenix vs Dynasty BO3 第一场 1月26日
2021/03/11 DOTA
python实现的登陆Discuz!论坛通用代码分享
2014/07/11 Python
python的变量与赋值详细分析
2017/11/08 Python
python re模块findall()函数实例解析
2018/01/19 Python
Python实现聊天机器人的示例代码
2018/07/09 Python
python3 线性回归验证方法
2019/07/09 Python
详解Django模版中加载静态文件配置方法
2019/07/21 Python
500行python代码实现飞机大战
2020/04/24 Python
keras分类模型中的输入数据与标签的维度实例
2020/07/03 Python
Python 实现 T00ls 自动签到脚本代码(邮件+钉钉通知)
2020/07/06 Python
python 实现逻辑回归
2020/12/30 Python
BannerBuzz加拿大:在线定制横幅印刷、广告和标志
2020/03/10 全球购物
CAT鞋加拿大官网:CAT Footwear加拿大
2020/08/05 全球购物
应届毕业生个人自荐信范文
2013/11/30 职场文书
励志演讲稿500字
2014/08/21 职场文书
乔迁之喜答谢词
2015/01/05 职场文书
经典导游欢迎词
2015/01/26 职场文书
开学第一周总结
2015/07/16 职场文书
五年级数学教学反思
2016/02/16 职场文书
springcloud之Feign超时问题的解决
2021/06/24 Java/Android
Springboot集成阿里云OSS上传文件系统教程
2021/06/28 Java/Android