사전 크기가 변경되면 Python 하위 프로세스 프로세스가 충돌합니다.

킬 고레 트라우트

참고 : 문제는 궁극적으로와 관련이 없으며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

왜 이런 일이 발생하는지에 대한 통찰력과이 오류를 처리하는 방법에 대한 조언을 주시면 대단히 감사하겠습니다!

jfs

오류 메시지는 문제가 무엇인지 정확히 알려줍니다.

>>> 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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

Python 하위 프로세스가 CPU 사용량 0 %로 무작위로 떨어지면서 프로세스가 "중단"됩니다.

분류에서Dev

닫기 전에 Python 쓰기 파일 프로세스가 충돌했습니다.

분류에서Dev

Python 하위 프로세스에서 Tshark를 사용하면 구문 오류가 발생합니다.

분류에서Dev

하위 프로세스를 사용하는 Python의 스크립트가 작동하지 않습니다.

분류에서Dev

다중 처리 풀이 생성되면 Python 하위 프로세스 wait ()가 실패합니다.

분류에서Dev

하위 프로세스의 dup2가 상위 프로세스의 fd 테이블을 변경합니까?

분류에서Dev

Python : Popen-백그라운드 하위 프로세스가 아닌 주 프로세스를 기다립니다.

분류에서Dev

Python : Popen-백그라운드 하위 프로세스가 아닌 주 프로세스를 기다립니다.

분류에서Dev

os.sytem ()을 사용하여 하위 프로세스를 시작할 때 Python 상위 프로세스가 SIGTERM / SIGINT 신호를 포착하지 않습니다.

분류에서Dev

Python 하위 프로세스 내보내기 환경 변수 (다른 환경 변수 사용)

분류에서Dev

Python 하위 프로세스가 루프에서 호출 될 때 파일로 출력되지 않습니다.

분류에서Dev

다중 스레드 Perl 스크립트는 Python 하위 프로세스로 호출되면 파이프가 끊어짐

분류에서Dev

Python 하위 프로세스가 반환되지 않음

분류에서Dev

countdowntimer가 완료되기 전에 조각을 변경하면 응용 프로그램이 Android에서 충돌합니다.

분류에서Dev

하위 프로세스 Popen : 신호가 전파되지 않음

분류에서Dev

Python 하위 프로세스 출력 변수 오류; 변수가 정의되지 않았습니다.

분류에서Dev

하위 프로세스를 사용하여 readline 기반 Python 프로그램을 효과적으로 테스트하려면 어떻게해야합니까?

분류에서Dev

하위 프로세스가 호출되기 전에 Python 콘솔이 인쇄되지 않음

분류에서Dev

"셸 스크립트"를 문자열로 Python 하위 프로세스에 전달합니다.

분류에서Dev

Python 다중 처리 : 부모 프로세스가 종료되면 자식 프로세스가 중단됩니까?

분류에서Dev

OS X에서 Python 프로세스가 종료 될 때 하위 프로세스가 종료되지 않는 이유는 무엇입니까?

분류에서Dev

Python 하위 프로세스는 다른 프로세스에서 사용하고 있기 때문에 .bat 파일에 액세스 할 수 없습니다.

분류에서Dev

Python 하위 프로세스가 Nginx를 다시로드하지 않습니다.

분류에서Dev

python2의 하위 프로세스가 오류를 반환합니다.

분류에서Dev

상위 프로세스에 여러 하위 프로세스가 있고 2 개 하위 프로세스에 하위 프로세스가 있습니다.

분류에서Dev

프로세스가 완료되어 다른 프로세스를 시작하기를 기다립니다.

분류에서Dev

Drush가 하위 프로세스에서 시작되면 중단됩니다.

분류에서Dev

사용자 공간 프로세스가 루트 하위 프로세스를 시작할 수 있습니까?

분류에서Dev

사용자가 프로세스를 실행하고 소유자가 되려면 로그인해야합니까?

Related 관련 기사

  1. 1

    Python 하위 프로세스가 CPU 사용량 0 %로 무작위로 떨어지면서 프로세스가 "중단"됩니다.

  2. 2

    닫기 전에 Python 쓰기 파일 프로세스가 충돌했습니다.

  3. 3

    Python 하위 프로세스에서 Tshark를 사용하면 구문 오류가 발생합니다.

  4. 4

    하위 프로세스를 사용하는 Python의 스크립트가 작동하지 않습니다.

  5. 5

    다중 처리 풀이 생성되면 Python 하위 프로세스 wait ()가 실패합니다.

  6. 6

    하위 프로세스의 dup2가 상위 프로세스의 fd 테이블을 변경합니까?

  7. 7

    Python : Popen-백그라운드 하위 프로세스가 아닌 주 프로세스를 기다립니다.

  8. 8

    Python : Popen-백그라운드 하위 프로세스가 아닌 주 프로세스를 기다립니다.

  9. 9

    os.sytem ()을 사용하여 하위 프로세스를 시작할 때 Python 상위 프로세스가 SIGTERM / SIGINT 신호를 포착하지 않습니다.

  10. 10

    Python 하위 프로세스 내보내기 환경 변수 (다른 환경 변수 사용)

  11. 11

    Python 하위 프로세스가 루프에서 호출 될 때 파일로 출력되지 않습니다.

  12. 12

    다중 스레드 Perl 스크립트는 Python 하위 프로세스로 호출되면 파이프가 끊어짐

  13. 13

    Python 하위 프로세스가 반환되지 않음

  14. 14

    countdowntimer가 완료되기 전에 조각을 변경하면 응용 프로그램이 Android에서 충돌합니다.

  15. 15

    하위 프로세스 Popen : 신호가 전파되지 않음

  16. 16

    Python 하위 프로세스 출력 변수 오류; 변수가 정의되지 않았습니다.

  17. 17

    하위 프로세스를 사용하여 readline 기반 Python 프로그램을 효과적으로 테스트하려면 어떻게해야합니까?

  18. 18

    하위 프로세스가 호출되기 전에 Python 콘솔이 인쇄되지 않음

  19. 19

    "셸 스크립트"를 문자열로 Python 하위 프로세스에 전달합니다.

  20. 20

    Python 다중 처리 : 부모 프로세스가 종료되면 자식 프로세스가 중단됩니까?

  21. 21

    OS X에서 Python 프로세스가 종료 될 때 하위 프로세스가 종료되지 않는 이유는 무엇입니까?

  22. 22

    Python 하위 프로세스는 다른 프로세스에서 사용하고 있기 때문에 .bat 파일에 액세스 할 수 없습니다.

  23. 23

    Python 하위 프로세스가 Nginx를 다시로드하지 않습니다.

  24. 24

    python2의 하위 프로세스가 오류를 반환합니다.

  25. 25

    상위 프로세스에 여러 하위 프로세스가 있고 2 개 하위 프로세스에 하위 프로세스가 있습니다.

  26. 26

    프로세스가 완료되어 다른 프로세스를 시작하기를 기다립니다.

  27. 27

    Drush가 하위 프로세스에서 시작되면 중단됩니다.

  28. 28

    사용자 공간 프로세스가 루트 하위 프로세스를 시작할 수 있습니까?

  29. 29

    사용자가 프로세스를 실행하고 소유자가 되려면 로그인해야합니까?

뜨겁다태그

보관