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使用Flask框架获取用户IP地址的方法
Mar 21 Python
python获取外网IP并发邮件的实现方法
Oct 01 Python
Python 判断文件或目录是否存在的实例代码
Jul 19 Python
Python爬虫常用小技巧之设置代理IP
Sep 13 Python
对numpy下的轴交换transpose和swapaxes的示例解读
Jun 26 Python
Python 使用PyQt5 完成选择文件或目录的对话框方法
Jun 27 Python
python pandas模块基础学习详解
Jul 03 Python
Python实现基于SVM的分类器的方法
Jul 19 Python
Pycharm中import torch报错的快速解决方法
Mar 05 Python
使用pth文件添加Python环境变量方式
May 26 Python
Matplotlib自定义坐标轴刻度的实现示例
Jun 18 Python
python 实现端口扫描工具
Dec 18 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
Smarty模板快速入门
2007/01/04 PHP
php提高脚本性能的4个技巧
2020/08/18 PHP
JS弹出对话框返回值代码(asp.net后台)
2010/12/28 Javascript
深入理解JavaScript作用域和作用域链
2011/10/21 Javascript
点击隐藏页面左栏或右栏实现js代码
2013/04/01 Javascript
JS去掉第一个字符和最后一个字符的实现代码
2014/02/20 Javascript
动态创建script标签实现跨域资源访问的方法介绍
2014/02/28 Javascript
jQuery使用中可能被XSS攻击的一些危险环节提醒
2016/05/24 Javascript
Highcharts学习之数据列
2016/08/03 Javascript
jQuery实现右键菜单、遮罩等效果代码
2016/09/27 Javascript
AngularJS表单验证中级篇(3)
2016/09/28 Javascript
javascript实现的图片预览功能
2017/03/25 Javascript
微信小程序模板(template)使用详解
2018/01/31 Javascript
详解JS数值Number类型
2018/02/07 Javascript
你不可不知的Vue.js列表渲染详解
2019/10/01 Javascript
vue实现放大镜效果
2020/09/17 Javascript
vue缓存之keep-alive的理解和应用详解
2020/11/02 Javascript
[06:45]DOTA2卡尔工作室 英雄介绍幻影长矛手篇
2013/07/12 DOTA
[11:33]DAC2018 4.5SOLO赛决赛 MidOne vs Paparazi第二场
2018/04/06 DOTA
[50:27]OG vs LGD 2018国际邀请赛淘汰赛BO3 第一场 8.26
2018/08/30 DOTA
Python检测生僻字的实现方法
2016/10/23 Python
python机器学习之KNN分类算法
2018/08/29 Python
Tensorflow实现将标签变为one-hot形式
2020/05/22 Python
Python可以用来做什么
2020/11/23 Python
Python离线安装各种库及pip的方法
2020/11/28 Python
戴尔英国官网:Dell英国
2017/05/27 全球购物
荷兰皇家航空公司官方网站:KLM Royal Dutch Airlines
2017/12/07 全球购物
俄罗斯香水在线商店:AromaCode
2019/12/04 全球购物
九月份红领巾广播稿
2014/01/22 职场文书
道德大讲堂实施方案
2014/05/14 职场文书
公务员党员评议表自我鉴定
2014/09/14 职场文书
交通事故委托书范本
2014/09/28 职场文书
2014年项目经理工作总结
2014/11/24 职场文书
2014年乡镇民政工作总结
2014/12/02 职场文书
贷款担保书
2015/01/20 职场文书
2015年资料员工作总结
2015/04/25 职场文书