当字典大小更改时,python子进程崩溃

当字典大小更改时,python子进程崩溃,python,dictionary,subprocess,Python,Dictionary,Subprocess,注意:问题最终与子流程没有任何关系,只是在迭代时对dict进行了简单的修改 我有一个类Agent,它有一个launch()。此方法获取一个字典列表,其中包含一组控制其功能的参数,并在该列表上循环,为每个字典执行类似的工作注意:要启动,launch()调用subprocess.Popen(一次)启动需要运行launch()才能执行其工作的终端应用程序 在launch()期间,每个dict都会被修改-例如,添加一个键用于跟踪创建的文件,另一个键添加了launch()对该dict的参数所做工作的统计信

注意:问题最终与
子流程
没有任何关系,只是在迭代时对dict进行了简单的修改

我有一个类
Agent
,它有一个
launch()。此方法获取一个字典列表,其中包含一组控制其功能的参数,并在该列表上循环,为每个字典执行类似的工作注意:要启动,
launch()
调用
subprocess.Popen
(一次)启动需要运行
launch()
才能执行其工作的终端应用程序

launch()
期间,每个dict都会被修改-例如,添加一个键用于跟踪创建的文件,另一个键添加了
launch()
对该dict的参数所做工作的统计信息,等等。当
launch()
遍历所有参数dict时,我返回并循环浏览dict,将每个dict保存到一个
pickle
文件中,供以后使用

我的问题是,我使用
subprocess.Process
并行启动了几个
Agent
实例(每个实例都有自己的参数dict列表)注意:每个调用自己的
子流程.Popen
,使用不同的cmdline参数调用它打开的终端应用程序。一切正常,他们都创建自己的日志(正确保存到文件),将信息打印到控制台,获取正确的数据。但是,当每个单独的
launch()
的主循环完成,并且它们尝试循环各自的参数dict时,对于每个
进程
实例,我会得到以下错误(包括完整的回溯,以防它起源于何处!):


如果您能深入了解发生这种情况的原因,并就如何处理此错误提供建议,我们将不胜感激

错误消息准确地说明了问题所在:

>>> d = {1: 2}
>>> for k in d:
...     d[3] = 2
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
RuntimeError: dictionary changed size during iteration

在单独的过程中修改词典是可以的。默认情况下,进程处理数据的副本。

错误消息准确说明了问题所在:

>>> d = {1: 2}
>>> for k in d:
...     d[3] = 2
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
RuntimeError: dictionary changed size during iteration

在单独的过程中修改词典是可以的。默认情况下,进程处理数据的副本。

错误消息准确说明了问题所在:

>>> d = {1: 2}
>>> for k in d:
...     d[3] = 2
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
RuntimeError: dictionary changed size during iteration

在单独的过程中修改词典是可以的。默认情况下,进程处理数据的副本。

错误消息准确说明了问题所在:

>>> d = {1: 2}
>>> for k in d:
...     d[3] = 2
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
RuntimeError: dictionary changed size during iteration

在单独的过程中修改词典是可以的。默认情况下,进程在数据副本上工作。

如果没有看到您的代码,很难说什么。
launch()
所做的工作相当长,有很多子类和子方法,但我会尝试添加一些抽象版本。也许问题与子进程无关,但您只是在迭代字典时修改了它。是的,我很笨,我试图在最后迭代dict时删除一些“temp”键。谢谢。如果没有看到你的代码,很难说什么。
launch()
所做的工作有很多子类和子方法,但我会尝试添加一些抽象版本。也许问题与子流程无关,但你只是在迭代时修改了一个字典。是的,我很笨,我试图删除一些“temp”在结束时迭代dict时的键。谢谢。如果没有看到你的代码,很难说什么。
launch()
所做的工作有很多子类和子方法,但我会尝试添加一些抽象版本。也许问题与子流程无关,但你只是在迭代时修改了一个字典。是的,我很笨,我试图删除一些“temp”在结束时迭代dict时的键。谢谢。如果没有看到你的代码,很难说什么。
launch()
所做的工作有很多子类和子方法,但我会尝试添加一些抽象版本。也许问题与子流程无关,但你只是在迭代时修改了一个字典。是的,我很笨,我试图删除一些“temp”在结束时迭代dict时的键。谢谢