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目录操作之python遍历文件夹后将结果存储为xml
Jan 27 Python
Python中绑定与未绑定的类方法用法分析
Apr 29 Python
python基于itchat实现微信群消息同步机器人
Feb 27 Python
Python 专题五 列表基础知识(二维list排序、获取下标和处理txt文本实例)
Mar 20 Python
Python编程实现删除VC临时文件及Debug目录的方法
Mar 22 Python
Python 爬虫之Beautiful Soup模块使用指南
Jul 05 Python
用python打印菱形的实操方法和代码
Jun 25 Python
Django自定义用户表+自定义admin后台中的字段实例
Nov 18 Python
python实现双色球随机选号
Jan 01 Python
Python如何省略括号方法详解
Mar 21 Python
python中如何打包用户自定义模块
Sep 23 Python
Python 使用xlwt模块将多行多列数据循环写入excel文档的操作
Nov 10 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
Discuz 5.0 中读取纯真IP数据库函数分析
2007/03/16 PHP
快速开发一个PHP扩展图文教程
2008/12/12 PHP
php中显示数组与对象的实现代码
2011/04/18 PHP
mantis安装、配置和使用中的问题小结
2014/07/14 PHP
yii实现model添加默认值的方法(2种方法)
2016/01/06 PHP
简单谈谈php延迟静态绑定
2016/01/26 PHP
js每次Title显示不同的名言
2008/09/25 Javascript
jQuery的实现原理的模拟代码 -3 事件处理
2010/08/03 Javascript
悄悄用脚本检查你访问过哪些网站的代码
2010/12/04 Javascript
收集的一些Array及String原型对象的扩展实现代码
2010/12/05 Javascript
jQuery中hide()方法用法实例
2014/12/24 Javascript
简单实现Vue的observer和watcher
2016/12/21 Javascript
Mobile Web开发基础之四--处理手机设备的横竖屏问题
2017/08/11 Javascript
HTML5开发Kinect体感游戏的实例应用
2017/09/18 Javascript
jquery使用iscorll实现上拉、下拉加载刷新
2017/10/26 jQuery
jQuery插件Validation表单验证详解
2018/05/26 jQuery
详解Node.js中path模块的resolve()和join()方法的区别
2018/10/29 Javascript
es6 filter() 数组过滤方法总结
2019/04/03 Javascript
jQuery动态生成的元素绑定事件操作实例分析
2019/05/04 jQuery
layui的select联动实现代码
2019/09/28 Javascript
详解JavaScript数据类型和判断方法
2020/09/04 Javascript
基于element-ui封装表单金额输入框的方法示例
2021/01/06 Javascript
Python 使用requests模块发送GET和POST请求的实现代码
2016/09/21 Python
Django REST framework 单元测试实例解析
2019/11/07 Python
python线程信号量semaphore使用解析
2019/11/30 Python
Python run()函数和start()函数的比较和差别介绍
2020/05/03 Python
Python获取浏览器窗口句柄过程解析
2020/07/25 Python
利用CSS3实现自定义滚动条代码分享
2016/08/18 HTML / CSS
css3新单位vw、vh的使用教程
2018/03/23 HTML / CSS
CSS3实现时间轴特效
2020/11/02 HTML / CSS
澳大利亚领先的孕妇服装品牌:Mamaway
2018/08/14 全球购物
大学新学期计划书
2014/04/28 职场文书
港澳通行证委托书怎么写
2014/08/02 职场文书
2015年度员工自我评价范文
2015/03/11 职场文书
go web 预防跨站脚本的实现方式
2021/06/11 Golang
「睡美人」爱洛公主粘土人开订
2022/03/22 日漫