奇怪的python队列行为。如果队列未命名为“队列”,则会崩溃

奇怪的python队列行为。如果队列未命名为“队列”,则会崩溃,python,python-2.7,python-multithreading,Python,Python 2.7,Python Multithreading,这个名字说明了一切。我正在用Python2.7编写这个程序,并试图利用线程队列来生成一大堆web请求。问题是:我希望有两个不同的队列,一个用于处理线程化请求,另一个用于处理响应。如果我的程序中有一个队列没有命名为queue,例如,如果我想将初始队列命名为input_q,那么程序就会崩溃,并拒绝工作。这对我来说毫无意义。在下面的代码中,所有导入的自定义模块都工作得很好,至少它们是独立的,通过了所有的单元测试,并且看不出任何可能导致问题的原因 另外,通过诊断语句,我确定它在生成线程池之前崩溃 提前谢

这个名字说明了一切。我正在用Python2.7编写这个程序,并试图利用线程队列来生成一大堆web请求。问题是:我希望有两个不同的队列,一个用于处理线程化请求,另一个用于处理响应。如果我的程序中有一个队列没有命名为queue,例如,如果我想将初始队列命名为input_q,那么程序就会崩溃,并拒绝工作。这对我来说毫无意义。在下面的代码中,所有导入的自定义模块都工作得很好,至少它们是独立的,通过了所有的单元测试,并且看不出任何可能导致问题的原因


另外,通过诊断语句,我确定它在生成线程池之前崩溃

提前谢谢

编辑:这里的Crash可能是错误的术语。它实际上只是停止了。即使在等待半小时完成后,当原始程序在30秒内运行时,程序也不会运行。当我告诉它打印出来检查时,它只会使它部分地通过列表,停止在一个条目的中间,什么也不做。 编辑2:很抱歉浪费大家的时间,我忘了这篇文章。有人更改了我的一个自定义模块threadcheck。看起来它正在初始化模块,然后与程序的其余部分一起愉快地运行。线程检查在初始化后崩溃,当程序处于计算的中间时,崩溃就把整个事情都搞垮了。p> 代码:

名称是什么与Python无关——Python并不关心,对象本身在很大程度上甚至不知道它们被分配到的名称。所以问题一定出在别的地方

正如评论中所建议的,仔细检查队列的重命名


另外,在没有守护进程模式的情况下尝试。

它是如何崩溃的?它是否会给出错误消息?名称无效,所以您只是把重命名搞砸了。可能有一个异常被线程吞没,或者您等待一个空队列,它在生成线程池之前崩溃?在生成线程之前,你甚至不使用队列。我知道,这真的很奇怪。没有任何意义。我怀疑,正如@JochenRitzel所建议的,您在重命名时错过了队列的一个实例。事实上,queue的一些用法已经注释掉了带有input_q的备选方案,而其他用法则没有注释掉,这是一个很好的提示。尝试将队列重命名为testqueuerename并使用全局搜索和替换,而不是手动执行,然后查看它是否有效。
from binMod import binExtract
from grabZip import grabZip
import random
import Queue
import time
import threading
import urllib2
from threadCheck import threadUrl
import datetime

queue = Queue.Queue()
#output_q = Queue.Queue()
#input_q = Queue.Queue()
#output = queue

p=90
qb = 22130167533
url = grabZip(qb)
logFile = "log.txt"
metaC = url.grabMetacell()
toCheck = []
print metaC[0]['images']
print "beginning random selection"
for i in range(4):
    if (len(metaC[i]['images'])>0):
        print metaC[i]['images'][0]
        for j in range(len(metaC[i]['images'])):
            chance = random.randint(0, 100)
            if chance <= p:
                toCheck.append(metaC[i]['images'][j]['resolution 7 url'])

print "Spawning threads..."
for i in range(20):
    t = threadUrl(queue)
    t.setDaemon(True)
    t.start()
print "initializing queue..."
for i in range(len(toCheck)):
    queue.put(toCheck[i])

queue.join()    
#input_q.join()
output = open(logFile, 'a')
done = datetime.datetime.now()
results = "\n %s \t %s \t %s \t %s"%(done, qb, good, bad)
output.write(results)