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 相关文章推荐
Python2实现的LED大数字显示效果示例
Sep 04 Python
Python3中正则模块re.compile、re.match及re.search函数用法详解
Jun 11 Python
Python使用requests提交HTTP表单的方法
Dec 26 Python
Python计算时间间隔(精确到微妙)的代码实例
Feb 26 Python
Python小白必备的8个最常用的内置函数(推荐)
Apr 03 Python
python获取array中指定元素的示例
Nov 26 Python
Python运行DLL文件的方法
Jan 17 Python
Jupyter 无法下载文件夹如何实现曲线救国
Apr 22 Python
python中Ansible模块的Playbook的具体使用
May 28 Python
Python脚本如何在bilibili中查找弹幕发送者
Jun 04 Python
13个Pandas实用技巧,助你提高开发效率
Aug 19 Python
python定时截屏实现
Nov 02 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
上传文件先创建目录 再上传到目录里面去
2010/12/29 PHP
PHP模板引擎Smarty内建函数foreach,foreachelse用法分析
2016/04/11 PHP
Yii框架弹出窗口组件CJuiDialog用法分析
2017/01/07 PHP
php输出图像的方法实例分析
2017/02/16 PHP
网页中实现浏览器的最大,最小化和关闭按钮
2007/03/12 Javascript
传递参数的标准方法(jQuery.ajax)
2008/11/19 Javascript
javascript for循环设法提高性能
2010/02/24 Javascript
基于JavaScript 数据类型之Boolean类型分析介绍
2013/04/19 Javascript
给超链接添加特效鼠标移动展示提示信息且随鼠标移动
2013/10/17 Javascript
JavaScript中神奇的call()方法
2015/03/12 Javascript
js实现的二分查找算法实例
2016/01/21 Javascript
如何消除inline-block属性带来的标签间间隙
2016/03/31 Javascript
JQuery给select添加/删除节点的实现代码
2016/04/26 Javascript
Vue Transition实现类原生组件跳转过渡动画的示例
2017/08/19 Javascript
原生JS实现的雪花飘落动画效果
2018/05/03 Javascript
使用D3.js构建实时图形的示例代码
2018/08/28 Javascript
vue vantUI实现文件(图片、文档、视频、音频)上传(多文件)
2019/10/15 Javascript
Vue.extend 编程式插入组件的实现
2019/11/18 Javascript
使用vant的地域控件追加全部选项
2020/11/03 Javascript
pandas.dataframe中根据条件获取元素所在的位置方法(索引)
2018/06/07 Python
Python中的字符串切片(截取字符串)的详解
2019/05/15 Python
pytorch 模型可视化的例子
2019/08/17 Python
python中PyQuery库用法分享
2021/01/15 Python
Data URI scheme详解和使用实例及图片base64编码实现方法
2014/05/08 HTML / CSS
英国精品买手店:Browns Fashion
2016/09/29 全球购物
Lookfantastic瑞典:英国知名美妆购物网站
2018/04/06 全球购物
蹦床仓库:Trampoline Warehouse
2018/12/06 全球购物
尽职尽责村干部自我鉴定
2014/01/23 职场文书
产品质量承诺书范文
2014/03/27 职场文书
《学会合作》教学反思
2014/04/12 职场文书
落实八项规定专题民主生活会对照检查材料
2014/09/15 职场文书
物业接待员岗位职责
2015/04/15 职场文书
上市公司董事长岗位职责
2015/04/16 职场文书
大学生安全教育心得体会
2016/01/15 职场文书
浅谈tf.train.Saver()与tf.train.import_meta_graph的要点
2021/05/26 Python
国庆节到了,利用JS实现一个生成国庆风头像的小工具 详解实现过程
2021/10/05 Javascript