multiprocessing pool.map()得到“TypeError:list indices必须是整数,而不是str”

时间:2016-09-30 07:20:58

标签: python multiprocessing

我使用python的 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

运行代码一段时间后(不是立即),将抛出异常

{{1}}

可能有什么不对?这是{{1}}模块的错误吗?

1 个答案:

答案 0 :(得分:3)

当一个worker任务引发一个异常时,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

所以你可以在工人身上看到真正的追溯,而不仅仅是父母中的绝育,大多无用的追溯。