python task done_python queue task_done()问题
我对python多线程队列有问题。我有一个脚本,其中producer从输入队列获取元素,生成一些元素并将它们放入输出队列,consumer从输出队列获取元素并打印它们:import threading
import Queue
class Producer(threading.Thread):
def __init__(self, iq, oq):
threading.Thread.__init__(self)
self.iq = iq
self.oq = oq
def produce(self, e):
self.oq.put(e*2)
self.oq.task_done()
print "Producer %s produced %d and put it to output Queue"%(self.getName(), e*2)
def run(self):
while 1:
e = self.iq.get()
self.iq.task_done()
print "Get %d from input Queue"%(e)
self.produce(e)
class Consumer(threading.Thread):
def __init__(self, oq):
threading.Thread.__init__(self)
self.oq = oq
def run(self):
while 1:
e = self.oq.get()
self.oq.task_done()
print "Consumer get %d from output queue and consumed"%e
iq = Queue.Queue()
oq = Queue.Queue()
for i in xrange(2):
iq.put((i+1)*10)
for i in xrange(2):
t1 = Producer(iq, oq)
t1.setDaemon(True)
t1.start()
t2 = Consumer(oq)
t2.setDaemon(True)
t2.start()
iq.join()
oq.join()
但是,每次我运行它时,它的工作方式都不同(给出异常,或者消费者不做任何工作)。我认为问题出在task_done()命令中,有人能解释一下bug在哪里吗?
我修改了消费类:class Consumer(threading.Thread):
def __init__(self, oq):
threading.Thread.__init__(self)
self.oq = oq
def run(self):
while 1:
e = self.oq.get()
self.oq.task_done()
print "Consumer get %d from output queue and consumed"%e
page = urllib2.urlopen("http://www.ifconfig.me/ip")
print page
现在,每个task_done()命令之后的使用者都应该连接到网站(这需要一些时间),但它不需要,相反,如果task_done()之后的代码执行时间很短,它会运行,但如果很长,它不会运行!为什么?有人能解释一下这个问题吗?如果我把所有的东西都放在task_done()命令之前,那么我将从其他线程中阻塞队列,这已经足够愚蠢了。或者在python中的多线程有什么我遗漏的吗?
python task done_python queue task_done()问题相关推荐
- python中queue.Queue task_done
Queue.task_done() 与 Queue.join() 使用queue一般用于在线程间传递数据,通过queue.put()与queue.get()来获取任务数据,通常需要在任务执行完成之后进 ...
- Python标准库queue模块原理浅析
Python标准库queue模块原理浅析 本文环境python3.5.2 queue模块的实现思路 作为一个线程安全的队列模块,该模块提供了线程安全的一个队列,该队列底层的实现基于Python线程th ...
- python3.x,一个关于queue.task_done()与queue.join()的实验
最近在使用python的队列做一点东西,发现了queue.join(),这和以前使用的多线程thread.join()有什么不一样呢,自己做了个小实验,描述都在代码注释里了 from threadin ...
- Py之Queue:python库之Queue的简介、安装、使用方法之详细攻略
Py之Queue:python库之Queue的简介.安装.使用方法之详细攻略 目录 Queue的简介 Queue的安装 Queue的使用方法 1.queue模块有三种队列及构造函数 Queue的简介 ...
- python 中的queue, deque
python3 deque(双向队列) 创建双向队列 import collections d = collections.deque() append(往右边添加一个元素) import colle ...
- Python 线程队列 Queue – FIFO - Python零基础入门教程
目录 一.Python 线程队列分类 二.Python 线程先进先出队列 Queue 简介 三.Python 线程先进先出队列 Queue 常用函数 四.Python 线程先进先出队列 Queue 使 ...
- python模块之Queue
创建一个"队列"对象 import Queue myqueue = Queue.Queue(maxsize = 10) Queue.Queue类即是一个队列的同步实现.队列长度可为 ...
- python中的Queue
queue简介 Python的Queue模块提供一种适用于多线程编程的FIFO实现.它可用于在生产者(producer)和消费者(consumer)之间线程安全(thread-safe)地传递消息或其 ...
- python gevent queue_gevent.queue
Gevent gevent基础之阻塞,非阻塞 1.gevent中一个很大的改进就是将阻塞IO改为非阻塞IO: 阻塞调用是指调用结果返回之前,当前线程会被挂起.函数只有在得到结果之后才会返回 非阻塞指在 ...
最新文章
- JSP自定义标签_控制标签体是否执行
- Leetcode 22.括号生成 (每日一题 20210623)
- python里pai_关于python如何调用win32pai操作cmd的方法
- (10) 需求征集 -- 权限管理
- 串口与modem流量控制大全(2)
- 超赞!机器学习画图模板ML Visuals更新了
- java 注解加载配置文件_Spring的Java配置方式和读取properties配置文件
- 倾斜模型精细化处理_【干货】7款倾斜摄影三维模型修补的软件介绍
- ITK+VTK+VS环境搭建.Q:vs编译出问题参见VTK(一)哈。
- android自定义矩形框,Android中ImageCropper矩形、圆形 裁剪框的实现方法
- html中怎么给文字设置动画效果,文字效果怎么设置?
- 2022前端HTML5面试题
- 1386 安排电影院座位(字典、位运算)
- 模拟软件-OLED及Solar cell的模拟软件(Absorption模块)-[Setfos]
- Fréchet Inception Distance(FID)
- win10系统重置网络后,以太网没了,适配器显示为空了,电脑完全没网,这种情况怎么办?
- 减少USB 1.1 2.0 端口驱动程序延时_肉鸡啄羽、啄肛、啄蛋等现象如何减少,养殖的朋友们值得看一看...
- siki学院的飞机大作战UE4.26代码
- Cemu模拟铁拳TT2高清设置
- python 科学计算三维可视化笔记(第三周 高级进阶)