我对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()问题相关推荐

  1. python中queue.Queue task_done

    Queue.task_done() 与 Queue.join() 使用queue一般用于在线程间传递数据,通过queue.put()与queue.get()来获取任务数据,通常需要在任务执行完成之后进 ...

  2. Python标准库queue模块原理浅析

    Python标准库queue模块原理浅析 本文环境python3.5.2 queue模块的实现思路 作为一个线程安全的队列模块,该模块提供了线程安全的一个队列,该队列底层的实现基于Python线程th ...

  3. python3.x,一个关于queue.task_done()与queue.join()的实验

    最近在使用python的队列做一点东西,发现了queue.join(),这和以前使用的多线程thread.join()有什么不一样呢,自己做了个小实验,描述都在代码注释里了 from threadin ...

  4. Py之Queue:python库之Queue的简介、安装、使用方法之详细攻略

    Py之Queue:python库之Queue的简介.安装.使用方法之详细攻略 目录 Queue的简介 Queue的安装 Queue的使用方法 1.queue模块有三种队列及构造函数 Queue的简介 ...

  5. python 中的queue, deque

    python3 deque(双向队列) 创建双向队列 import collections d = collections.deque() append(往右边添加一个元素) import colle ...

  6. Python 线程队列 Queue – FIFO - Python零基础入门教程

    目录 一.Python 线程队列分类 二.Python 线程先进先出队列 Queue 简介 三.Python 线程先进先出队列 Queue 常用函数 四.Python 线程先进先出队列 Queue 使 ...

  7. python模块之Queue

    创建一个"队列"对象 import Queue myqueue = Queue.Queue(maxsize = 10) Queue.Queue类即是一个队列的同步实现.队列长度可为 ...

  8. python中的Queue

    queue简介 Python的Queue模块提供一种适用于多线程编程的FIFO实现.它可用于在生产者(producer)和消费者(consumer)之间线程安全(thread-safe)地传递消息或其 ...

  9. python gevent queue_gevent.queue

    Gevent gevent基础之阻塞,非阻塞 1.gevent中一个很大的改进就是将阻塞IO改为非阻塞IO: 阻塞调用是指调用结果返回之前,当前线程会被挂起.函数只有在得到结果之后才会返回 非阻塞指在 ...

最新文章

  1. JSP自定义标签_控制标签体是否执行
  2. Leetcode 22.括号生成 (每日一题 20210623)
  3. python里pai_关于python如何调用win32pai操作cmd的方法
  4. (10) 需求征集 -- 权限管理
  5. 串口与modem流量控制大全(2)
  6. 超赞!机器学习画图模板ML Visuals更新了
  7. java 注解加载配置文件_Spring的Java配置方式和读取properties配置文件
  8. 倾斜模型精细化处理_【干货】7款倾斜摄影三维模型修补的软件介绍
  9. ITK+VTK+VS环境搭建.Q:vs编译出问题参见VTK(一)哈。
  10. android自定义矩形框,Android中ImageCropper矩形、圆形 裁剪框的实现方法
  11. html中怎么给文字设置动画效果,文字效果怎么设置?
  12. 2022前端HTML5面试题
  13. 1386 安排电影院座位(字典、位运算)
  14. 模拟软件-OLED及Solar cell的模拟软件(Absorption模块)-[Setfos]
  15. Fréchet Inception Distance(FID)
  16. win10系统重置网络后,以太网没了,适配器显示为空了,电脑完全没网,这种情况怎么办?
  17. 减少USB 1.1 2.0 端口驱动程序延时_肉鸡啄羽、啄肛、啄蛋等现象如何减少,养殖的朋友们值得看一看...
  18. siki学院的飞机大作战UE4.26代码
  19. Cemu模拟铁拳TT2高清设置
  20. python 科学计算三维可视化笔记(第三周 高级进阶)

热门文章

  1. java做报表_一步一步使用POI做java报表
  2. java对象流读取完毕_从Java 8流中获取具有最大频率的对象
  3. Android 视频通话
  4. Android 截图,截取指定view截图
  5. TCP/IP完整的基础介绍
  6. windows 8 安装iis .net 3.5
  7. 开启Mysql远程登录账号
  8. spark 不同模式用途_Spark 的四种模式
  9. loadrunner学习理论之一
  10. 干货-iOS、mac开源项目及库,以后我也会持续更新。