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中的yield使用方法
Feb 11 Python
Python实现建立SSH连接的方法
Jun 03 Python
python黑魔法之参数传递
Feb 12 Python
Python 多进程并发操作中进程池Pool的实例
Nov 01 Python
基于pycharm导入模块显示不存在的解决方法
Oct 13 Python
对Pyhon实现静态变量全局变量的方法详解
Jan 11 Python
Python虚拟环境的原理及使用详解
Jul 02 Python
详解一种用django_cache实现分布式锁的方式
Sep 01 Python
python 爬取古诗文存入mysql数据库的方法
Jan 08 Python
matplotlib 范围选区(SpanSelector)的使用
Feb 24 Python
用pip给python安装matplotlib库的详细教程
Feb 24 Python
如何理解及使用Python闭包
Jun 01 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 extract 将数组拆分成多个变量的函数
2010/06/30 PHP
php HTML无刷新提交表单
2016/04/05 PHP
利用Homestead快速运行一个Laravel项目的方法详解
2017/11/14 PHP
PHP文件上传小程序 适合初学者学习!
2019/05/23 PHP
测试你的JS的掌握程度的代码
2009/12/09 Javascript
location.href用法总结(最主要的)
2013/12/27 Javascript
js中switch case循环实例代码
2013/12/30 Javascript
javascript如何使用bind指定接收者
2014/05/04 Javascript
javascript 判断整数方法分享
2014/12/16 Javascript
js闭包所用的场合以及优缺点分析
2015/06/22 Javascript
Yarn的安装与使用详细介绍
2016/10/25 Javascript
JS前端开发判断是否是手机端并跳转操作(小结)
2017/02/05 Javascript
详解angularjs 关于ui-router分层使用
2017/06/12 Javascript
Webpack执行命令参数详解
2017/06/17 Javascript
Node.js静态服务器的实现方法
2018/02/28 Javascript
JavaScript DOM元素常见操作详解【添加、删除、修改等】
2018/05/09 Javascript
jQuery序列化form表单数据为JSON对象的实现方法
2018/09/20 jQuery
Element实现表格分页数据选择+全选所有完善批量操作
2019/06/07 Javascript
layui关闭层级、简单监听的实例
2019/09/06 Javascript
使用Vue-scroller页面input框不能触发滑动的问题及解决方法
2020/08/08 Javascript
理解JavaScript中的对象
2020/08/25 Javascript
vue自定义树状结构图的实现方法
2020/10/18 Javascript
Python实现句子翻译功能
2017/11/14 Python
Python数据结构与算法之常见的分配排序法示例【桶排序与基数排序】
2017/12/15 Python
Python实现爬取百度贴吧帖子所有楼层图片的爬虫示例
2018/04/26 Python
用python求一个数组的和与平均值的实现方法
2019/06/29 Python
Python爬虫工具requests-html使用解析
2020/04/29 Python
pandas to_excel 添加颜色操作
2020/07/14 Python
windows下python 3.9 Numpy scipy和matlabplot的安装教程详解
2020/11/28 Python
python利用文件时间批量重命名照片和视频
2021/02/09 Python
英国最大的女士服装零售商:Bonmarché
2017/08/17 全球购物
数控技术与应用毕业生自荐信
2013/09/24 职场文书
大学生文员专业个人求职信范文
2014/01/05 职场文书
高一军训的心得体会
2014/09/01 职场文书
英语教师求职信范文
2015/03/20 职场文书
2016七夕情人节寄语
2015/12/04 职场文书