KeyError:0 在 python 中使用多处理

Posted

技术标签:

【中文标题】KeyError:0 在 python 中使用多处理【英文标题】:KeyError: 0 using multiprocessing in python 【发布时间】:2014-04-10 18:43:37 【问题描述】:

我有以下代码,我尝试调用一个函数 compute_cluster 进行一些计算并将结果写入 txt 文件(每个进程独立将其结果写入不同的 txt 文件),但是,当我运行以下代码时:

def main():
  p = Pool(19)
  p.map(compute_cluster, [(l, r) for l in range(6, 25) for r in range(1, 4)]) 
  p.close()
if __name__ == "__main__":
   main()                

它崩溃并出现以下错误:

File "RMSD_calc.py", line 124, in <module>
  main()                
File "RMSD_calc.py", line 120, in main
  p.map(compute_cluster, [(l, r) for l in range(6, 25) for r in range(1, 4)]) 
File "/usr/local/lib/python2.7/multiprocessing/pool.py", line 225, in map
  return self.map_async(func, iterable, chunksize).get()
File "/usr/local/lib/python2.7/multiprocessing/pool.py", line 522, in get
  raise self._value
  KeyError: 0

当我在网上搜索“KeyError: 0”的含义时,我没有发现任何有用的信息,因此非常感谢任何关于为什么会发生此错误的建议

【问题讨论】:

KeyError 是当您尝试取消引用字典等项目时的一般错误。 x[1],但索引(即1)不在字典中。但这并不能真正解释那里解引用字典的原因。 compute_cluster() 的头部是什么,这个函数返回什么? compute_cluster() 的某个地方,您有一个KeyError。也许您错误地使用了字典?我们不知道在哪里,除非您也添加compute_cluster() 工具的代码。该函数在另一个进程中运行的事实使其更难调试。从追溯来看,看起来错误来自多处理,但很可能是传递的函数中的问题。 【参考方案1】:

KeyError 发生在子进程中的 compute_cluster() 中,p.map() 在父进程中为您重新引发它:

from multiprocessing import Pool

def f(args):
    d = 
    d[0] # <-- raises KeyError

if __name__=="__main__":
    p = Pool()
    p.map(f, [None])

输出

Traceback (most recent call last):
  File "raise-exception-in-child.py", line 9, in <module>
    p.map(f, [None])
  File "/usr/lib/python2.7/multiprocessing/pool.py", line 227, in map
    return self.map_async(func, iterable, chunksize).get()
  File "/usr/lib/python2.7/multiprocessing/pool.py", line 528, in get
    raise self._value
KeyError: 0

要查看完整的回溯,请在子进程中捕获异常:

import logging
from multiprocessing import Pool

def f(args):
    d = 
    d[0] # <-- raises KeyError

def f_mp(args):
    try:
        return f(args)
    except Exception:
        logging.exception("f(%r) failed" % (args,))

if __name__=="__main__":
    p = Pool()
    p.map(f_mp, [None])

输出

ERROR:root:f(None) failed
Traceback (most recent call last):
  File "raise-exception-in-child.py", line 10, in f_mp
    return f(args)
  File "raise-exception-in-child.py", line 6, in f
    d[0] # <-- raises KeyError
KeyError: 0

说明是d[0]引起了异常。

【讨论】:

以上是关于KeyError:0 在 python 中使用多处理的主要内容,如果未能解决你的问题,请参考以下文章

KeyError: 'commentCount' 在 Python 中使用 Youtube API

导入 python 模块时如何解决 KeyError?

python字典日期时间作为键,keyError

Pytorch:“KeyError:在 DataLoader 工作进程 0 中捕获 KeyError。”

python里出现keyerror 怎么解决

Python 3使用正确的哈希来解决KeyError问题