我使用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}}模块的错误吗?
答案 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
所以你可以在工人身上看到真正的追溯,而不仅仅是父母中的绝育,大多无用的追溯。