2012-09-21 60 views
1

名稱種類全稱。我正在用python 2.7編寫這個程序,並且我正在嘗試利用線程隊列來創建大量的web請求。問題出在這裏:我想有兩個不同的隊列,一個處理線程請求,另一個處理響應。如果我的程序中有一個未命名爲「隊列」的隊列,例如,如果我想將初始隊列命名爲「input_q」,那麼程序崩潰並拒絕工作。這對我來說絕對沒有意義。在下面的代碼中,所有導入的自定義模塊都可以正常工作(至少,它們是獨立完成的,通過了所有單元測試,並且沒有看到任何可能成爲問題根源的原因)。奇怪的python隊列行爲。如果隊列未被命名爲「隊列」,則崩潰

另外,通過診斷語句,我確定它在產生線程池之前崩潰。

在此先感謝。

編輯:崩潰在這裏可能是錯誤的術語。它實際上只是停止。即使在等待半小時完成後,當原始程序在30秒內運行時,程序也不會運行。當我告訴它打印出檢查結果時,它只會使其列入清單的一部分,停在入口中間,什麼都不做。編輯2:對不起浪費大家的時間,我忘了這篇文章。有人改變了我的一個自定義模塊(threadcheck)。它看起來像是初始化模塊,然後沿着它與程序其餘部分的快樂方式運行。 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) 
+2

它如何崩潰?它是否提供錯誤信息? – BrenBarn

+2

這個名字沒有任何作用,所以你只是搞砸了重命名。也許有一個異常在線程中被吞噬,或者你等待一個空隊列 –

+0

「它在產生線程池之前崩潰」?在產卵線程之前您甚至不使用隊列。 –

回答

0

什麼名稱是無關的Python - Python並不關心,和對象本身(大部分),甚至不知道他們有名字被分配給。所以問題必須在別的地方。

正如評論中的建議,仔細檢查你的重命名爲queue

另外,不使用守護進程模式嘗試它。