2016-09-30 23 views
2

我做Python的multiprocessing.Pool模塊多,卻得到了TypeError: list indices must be integers, not str錯誤:多pool.map()得到 「類型錯誤:列表索引必須是整數,而不是STR」

這裏是我的代碼:

def getData(qid): 
    r = requests.get("http://api.xxx.com/api?qid=" + qid) 
    if r.status == 200: 
     DBC.save(json.loads(r.text)) 

def getAnotherData(qid): 
    r = requests.get("http://api.xxxx.com/anotherapi?qid=" + qid) 
    if r.status == 200: 
     DBC.save(json.loads(r.text)) 

def getAllData(qid): 
    print qid 
    getData(str(qid)) 
    getAnotherData(str(qid)) 


if __name__ == "__main__": 
    pool = Pool(processes=200) 
    pool.map(getAllData, range(10000, 700000)) 

運行代碼一段時間(不立即)後,將引發異常出

pool.map(getAllData, range(10000, 700000)) 
    File "/usr/lib/python2.7/multiprocessing/pool.py", line 251, in map 
    return self.map_async(func, iterable, chunksize).get() 
    File "/usr/lib/python2.7/multiprocessing/pool.py", line 567, in get 
    raise self._value 
TypeError: list indices must be integers, not str 

出了什麼問題?它是Pool模塊的錯誤嗎?

回答

3

當工作任務引發異常時,Pool捕獲它,將其發送回父進程並重新渲染該異常,但這不會保留原始回溯(所以您只會看到它在父代中被重新評估的位置過程,這不是很有幫助)。猜測,DBC.save中的某些內容預計從JSON加載的值爲int,實際上它是str

如果你想看到真正的回溯,import traceback在頂層,並改變你的工人功能的頂級水平:

def getAllData(qid): 
    try: 
     print qid 
     getData(str(qid)) 
     getAnotherData(str(qid)) 
    except: 
     traceback.print_exc() 
     raise 

,所以你可以看到在工人的真實回溯,不僅僅是父母中絕大多數是無用的回溯。

+0

謝謝,夥計,真的給了我一個線索! – armnotstrong

相關問題