1

这个名字就说明了一切。我正在用 python 2.7 编写这个程序,我试图利用线程队列来发出一大堆网络请求。这就是问题所在:我想要两个不同的队列,一个用于处理线程请求,另一个用于处理响应。如果我的程序中有一个未命名为“queue”的队列,例如,如果我希望将初始队列命名为“input_q”,那么程序将崩溃并拒绝工作。这对我来说完全没有意义。在下面的代码中,所有导入的自定义模块都可以正常工作(至少,它们是独立完成的,通过了所有单元测试,并且看不出有任何原因可能是问题的根源)。

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

提前致谢。

编辑:崩溃在这里可能是错误的术语。它实际上只是停止。即使等了半个小时完成,当原始程序运行不到三十秒时,程序也不会运行。当我告诉它打印 toCheck 时,它只会让它在列表中的一部分,停在一个条目的中间,什么也不做。

EDIT2:抱歉浪费大家的时间,我忘记了这篇文章。有人更改了我的一个自定义模块(线程检查)。看起来它正在初始化模块,然后与程序的其余部分一起愉快地运行。Threadcheck 在初始化后崩溃,当程序处于计算过程中时,崩溃导致整个事情都崩溃了。

代码:

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)   
4

1 回答 1

0

名称与Python 无关——Python 不在乎,对象本身(大部分)甚至不知道它们被分配的名称。所以问题必须在其他地方。

正如评论中所建议的那样,仔细检查您对queue.

另外,请尝试不使用守护程序模式。

于 2012-10-05T18:19:20.110 回答