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读取sqlite数据库文件的方法分析
Aug 07 Python
Python基于time模块求程序运行时间的方法
Sep 18 Python
Python实现可自定义大小的截屏功能
Jan 20 Python
对python For 循环的三种遍历方式解析
Feb 01 Python
PyQt5重写QComboBox的鼠标点击事件方法
Jun 25 Python
PyQT5 QTableView显示绑定数据的实例详解
Jun 25 Python
python 提取文件指定列的方法示例
Aug 07 Python
python获取指定日期范围内的每一天,每个月,每季度的方法
Aug 08 Python
扩展Django admin的list_filter()可使用范围方法
Aug 21 Python
基于python实现把图片转换成素描
Nov 13 Python
django model object序列化实例
Mar 13 Python
Django用数据库表反向生成models类知识点详解
Mar 25 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板块横排显示图片的实现方法
2007/05/28 PHP
PHP操作mysql函数详解,mysql和php交互函数
2011/05/19 PHP
PHP基础之运算符的使用方法
2013/04/28 PHP
详解php反序列化
2020/06/10 PHP
十分钟打造AutoComplete自动完成效果代码
2009/12/26 Javascript
Javascript 异步加载详解(浏览器在javascript的加载方式)
2012/05/20 Javascript
简单时间提示DEMO从0开始一直进行计时
2013/11/19 Javascript
通过JS判断联网类型和连接状态的实现代码
2015/04/01 Javascript
AngularJS基础 ng-options 指令详解
2016/08/02 Javascript
js实现前端分页页码管理
2017/01/06 Javascript
JavaScript无缝滚动效果的实例代码
2017/03/27 Javascript
jQuery常用选择器详解
2017/07/17 jQuery
详解用node搭建简单的静态资源管理器
2017/08/09 Javascript
Vue.js与 ASP.NET Core 服务端渲染功能整合
2017/11/16 Javascript
vue2.0 兄弟组件(平级)通讯的实现代码
2018/01/15 Javascript
vue实现压缩图片预览并上传功能(promise封装)
2019/01/10 Javascript
微信小程序MUI导航栏透明渐变功能示例(通过改变opacity实现)
2019/01/24 Javascript
详解bootstrap-fileinput文件上传控件的亲身实践
2019/03/21 Javascript
jQuery HTML设置内容和属性操作实例分析
2020/05/20 jQuery
js实现3D粒子酷炫动态旋转特效
2020/09/13 Javascript
[44:47]Ti4 循环赛第三日 iG vs NaVi
2014/07/12 DOTA
[38:23]完美世界DOTA2联赛循环赛 FTD vs PXG BO2第二场 11.01
2020/11/02 DOTA
Python中使用copy模块实现列表(list)拷贝
2015/04/14 Python
Python通过matplotlib画双层饼图及环形图简单示例
2017/12/15 Python
运用TensorFlow进行简单实现线性回归、梯度下降示例
2018/03/05 Python
Python操作mongodb数据库的方法详解
2018/12/08 Python
Python matplotlib画图与中文设置操作实例分析
2019/04/23 Python
Python发起请求提示UnicodeEncodeError错误代码解决方法
2020/04/21 Python
PyQt5结合matplotlib绘图的实现示例
2020/09/15 Python
基于python获取本地时间并转换时间戳和日期格式
2020/10/27 Python
老人祝寿主持词
2014/03/28 职场文书
《锄禾》教学反思
2014/04/08 职场文书
检察院对照“四风”认真查找问题落实整改措施
2014/09/26 职场文书
postgresql 删除重复数据案例详解
2021/08/02 PostgreSQL
MySQL8.0的WITH查询详情
2021/08/30 MySQL
用JS写一个发布订阅模式
2021/11/07 Javascript