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多线程http下载实现示例
Dec 30 Python
python 读写txt文件 json文件的实现方法
Oct 22 Python
Python分治法定义与应用实例详解
Jul 28 Python
python3连接MySQL数据库实例详解
May 24 Python
Selenium控制浏览器常见操作示例
Aug 13 Python
用Python将结果保存为xlsx的方法
Jan 28 Python
Pandas聚合运算和分组运算的实现示例
Oct 17 Python
python中shell执行知识点
May 06 Python
详解pandas中利用DataFrame对象的.loc[]、.iloc[]方法抽取数据
Dec 13 Python
python切片作为占位符使用实例讲解
Feb 17 Python
用Python将库打包发布到pypi
Apr 13 Python
Python实现天气查询软件
Jun 07 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 SQL防注入代码集合
2008/04/25 PHP
php简单实现屏蔽指定ip段用户的访问
2015/04/29 PHP
ThinkPHP框架安全实现分析
2016/03/14 PHP
让ThinkPHP的模板引擎达到最佳效率的方法详解
2017/03/14 PHP
初学prototype,发个JS接受URL参数的代码
2006/09/25 Javascript
jQuery获取文本节点之 text()/val()/html() 方法区别
2011/03/01 Javascript
JavaScript之HTMLCollection接口代码
2011/04/27 Javascript
将数字转换成大写的人民币表达式的js函数
2014/09/21 Javascript
JQuery创建DOM节点的方法
2015/06/11 Javascript
javascript倒计时效果实现
2015/11/12 Javascript
vue,angular,avalon这三种MVVM框架优缺点
2016/04/27 Javascript
JavaScript中instanceof运算符的使用示例
2016/06/08 Javascript
基于jquery实现的鼠标悬停提示案例
2016/12/11 Javascript
Websocket协议详解及简单实例代码
2016/12/12 Javascript
JavaScript实现shuffle数组洗牌操作示例
2019/01/03 Javascript
详解Python nose单元测试框架的安装与使用
2017/12/20 Python
python使用logging模块发送邮件代码示例
2018/01/18 Python
Python用 KNN 进行验证码识别的实现方法
2018/02/06 Python
基于python指定包的安装路径方法
2018/10/27 Python
Python 使用 attrs 和 cattrs 实现面向对象编程的实践
2019/06/12 Python
关于Tensorflow 模型持久化详解
2020/02/12 Python
python中format函数如何使用
2020/06/22 Python
Keras搭建自编码器操作
2020/07/03 Python
HTML5的download属性详细介绍和使用实例
2014/04/23 HTML / CSS
美国一家著名的手表在线折扣网站:Discount Watch Store
2020/02/24 全球购物
澳大利亚在线性感内衣商店:Fantasy Lingerie
2021/02/07 全球购物
澳大利亚人信任的清洁平台,您的私人管家:Jarvis
2020/12/25 全球购物
优秀应届毕业生自荐信
2013/11/16 职场文书
外贸业务员的岗位职责
2013/11/23 职场文书
股东协议书范本
2014/04/14 职场文书
诚信考试倡议书
2014/04/15 职场文书
追悼会答谢词
2015/01/05 职场文书
水知道答案观后感
2015/06/08 职场文书
2016习总书记系列重要讲话心得体会
2016/01/15 职场文书
护士医德医风心得体会
2016/01/25 职场文书
详解Spring Bean的配置方式与实例化
2022/06/10 Java/Android