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发送邮件的实例代码(支持html、图片、附件)
Mar 04 Python
python with statement 进行文件操作指南
Aug 22 Python
windows下python之mysqldb模块安装方法
Sep 07 Python
python利用标准库如何获取本地IP示例详解
Nov 01 Python
Flask web开发处理POST请求实现(登录案例)
Jul 26 Python
Python常见排序操作示例【字典、列表、指定元素等】
Aug 15 Python
浅谈Python大神都是这样处理XML文件的
May 31 Python
对django中foreignkey的简单使用详解
Jul 28 Python
python框架flask入门之路由及简单实现方法
Jun 07 Python
解决pytorch 交叉熵损失输出为负数的问题
Jul 07 Python
Python趣味挑战之用pygame实现简单的金币旋转效果
May 31 Python
一篇文章带你了解Python和Java的正则表达式对比
Sep 15 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
隐性调用php程序的方法
2009/03/09 PHP
解析yahoo邮件用phpmailer发送的实例
2013/06/24 PHP
PHP将Excel导入数据库及数据库数据导出至Excel的方法
2015/06/24 PHP
十个PHP高级应用技巧果断收藏
2015/09/25 PHP
mysql查找删除重复数据并只保留一条实例详解
2016/09/24 PHP
PHP实现实时生成并下载超大数据量的EXCEL文件详解
2017/10/23 PHP
你需要知道的JavsScript可以做什么?
2007/06/29 Javascript
JS模块与命名空间的介绍
2013/03/22 Javascript
使用js解决由border属性引起的div宽度问题
2013/11/26 Javascript
js判断undefined类型示例代码
2014/02/10 Javascript
JQuery实现鼠标移动图片显示描述层的方法
2015/06/25 Javascript
jQuery解决input超多的表单提交
2015/08/10 Javascript
Jquery和Js获得元素标签名称的方法总结
2016/10/08 Javascript
Javascript动画效果(3)
2016/10/11 Javascript
JavaScript模板引擎Template.js使用详解
2016/12/15 Javascript
JavaScript实现计算多边形质心的方法示例
2018/01/31 Javascript
Vue2.0结合webuploader实现文件分片上传功能
2018/03/09 Javascript
Vue.js进阶知识点总结
2018/04/01 Javascript
webpack file-loader和url-loader的区别
2019/01/15 Javascript
vue中使用vue-cli接入融云实现即时通信
2019/04/19 Javascript
微信小程序基于高德地图查找位置并显示文字
2019/10/30 Javascript
基于JavaScript实现轮播图效果
2021/01/02 Javascript
Python多线程结合队列下载百度音乐的方法
2015/07/27 Python
django认证系统实现自定义权限管理的方法
2018/07/16 Python
解决yum对python依赖版本问题
2019/07/05 Python
python 处理微信对账单数据的实例代码
2019/07/19 Python
详解Python在使用JSON时需要注意的编码问题
2019/12/06 Python
Python函数参数类型及排序原理总结
2019/12/19 Python
用html5的canvas和JavaScript创建一个绘图程序的简单实例
2016/07/06 HTML / CSS
实习老师个人总结的自我评价
2013/09/28 职场文书
顶岗实习计划书
2014/01/10 职场文书
微电影大赛策划方案
2014/06/05 职场文书
村班子对照检查材料
2014/08/18 职场文书
社区创先争优承诺书
2014/08/30 职场文书
毕业酒会致辞
2015/07/29 职场文书
golang 在windows中设置环境变量的操作
2021/04/29 Golang