참고 : 문제는 궁극적으로와 관련이 없으며subprocess
반복하는 동안 간단한 dict 수정일뿐입니다.
데이터를 수집하고, 로그를 작성하고, 콘솔에 인쇄하는 등 여러 작업을 수행 Agent
하는 launch()
메서드 가있는 클래스 가 있습니다 . 이 메서드는 수행하는 작업을 제어하는 매개 변수가있는 사전 목록을 가져 와서 각 사전에 대해 유사한 작업을 수행하는이 사전 목록을 반복합니다. 참고 : 시작하려면 (한 번) launch()
호출 하여 작업을 수행하기 위해 subprocess.Popen
실행해야하는 터미널 응용 프로그램을 시작합니다 launch()
.
시는 launch()
각 딕셔너리가 수정 - 예를 들어, 키가 다른 키는 작업에 대한 통계를 추가 생성 된 파일을 추적하기위한 추가 launch()
하는 경우 등 그 DICT의 매개 변수에했던 launch()
모든 매개 변수 dicts을 통해 반복했습니다, 나는 돌아 가야 pickle
나중 을 위해 각각을 파일에 저장하기 위해 dicts를 반복합니다 .
내 문제는 Agent
.NET을 사용하여 여러 인스턴스 (각각 매개 변수 사전 목록이있는)를 병렬로 시작한다는 것 subprocess.Process
입니다. 참고 : 각각 subprocess.Popen
다른 cmdline 인수를 사용하여 자신 이 여는 터미널 앱을 호출합니다 . 모든 것이 잘 작동하고, 모두 로그를 만들고 (올바르게 파일에 저장 됨) 콘솔에 정보를 인쇄하고, 올바른 데이터를 가져옵니다. 그러나 각 개인의 메인 루프가 launch()
완료되고 각 매개 변수 딕셔너리를 반복하려고하면 각 Process
인스턴스 에 대해 다음 오류가 발생 합니다 (원래 위치가 중요한 경우 전체 트레이스 백이 포함됩니다!).
Process Process-1:
Traceback (most recent call last):
File "/Users/--/.pyenv/versions/2.7.10/lib/python2.7/multiprocessing/process.py", line 258, in _bootstrap
self.run()
File "/Users/--/.pyenv/versions/2.7.10/lib/python2.7/multiprocessing/process.py", line 114, in run
self._target(*self._args, **self._kwargs)
File "../app/api.py", line 28, in spawn
agent.launch(**kwargs)
File "../app/agent.py", line 94, in launch
self.subagent.launch(...)
File "../app/subagent.py", line 445, in launch
for param_dicts in self.finished+self.graveyard:
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
이를 수정하려면 루프 내에서 사전을 수정해야하는 경우 (또는이를 수행 할 수있는 백그라운드 스레드가있는 경우) 키를 복사하십시오.
>>> for k in list(d):
... d[4] = 3
...
>>>
별도의 프로세스에서 사전을 수정하는 것은 괜찮습니다. 프로세스는 기본적으로 데이터 사본에서 작동합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다