2013-09-03 3 views
0

나는 복수 스레드가 때때로 동결되는 (분명히 동시에) 스레드가 여러 개있는 threading- 스레드가있는 python 스크립트가 있습니다. 이 스크립트에서는 실행중인 모든 스레드에서 스택 추적을 덤프하는 신호 처리기를 등록했습니다. 고정되면 덤프 된 스택이 표시되지 않습니다. 무엇이 이것을 일으킬 수 있습니까?파이썬 등록 신호를 무시할 수있는 원인은 무엇입니까?

마음에 와서 가능성의 몇 가지 : 스레드가하는 mutex 해제를 획득하려고 다른 스레드를 동결되지

  • . 그러나이 경우 신호 처리기가 작동 할 것으로 기대합니다. 나는 틀린가?
  • stdoutstderrr에 여러 가지 로그를 기록하며 bash 명령 줄을 사용하여 로그 파일로 리디렉션됩니다. 아마도 2 스레드의 정확한 시간 출력이 OS 수준에서 차단 될 수 있습니까? 이 스크립트는 문제없이 몇 달 동안 실행되었습니다. 최근에 커널 업데이트가 있었지만 (우분투 12.04입니다). 이 경우, 신호가 무시되지 않고 그냥 출력을 생성하지 않습니다 ...
  • 나는 동결 스레드에 의해 읽고 쓰여지는 몇 가지 전역 변수가 있습니다. 나는 파이썬 2.7이이 것을 안전하게하기 위해 글로벌 쓰레드 락을 가지고 있다고 생각했으며, 이전에는 문제가되지 않았다.

답변

3

파이썬의 signal 모듈은 메인 인터프리터 스레드에서만 신호 처리기를 실행합니다. 주 스레드가 멈춰서 파이썬 코드를 실행할 수없는 경우 신호 처리기가 실행되지 않습니다. 신호가 발사되어 잡히지 만 스레드가 파이썬 코드를 실행할 수 없으면 아무 일도 일어나지 않습니다.

이 상황을 피하는 가장 좋은 방법은 주 스레드 (시작시 파이썬 인터프리터에있는 첫 번째 스레드)가 교착 상태가 아닌지 확인하는 것입니다. 이것은 초기화 후에 해당 스레드에서 중요한 일이 발생하지 않도록하는 것을 의미합니다.

+0

어쨌든 신호의 특성으로 인해 작동하지 않아야합니까? – zneak

+0

@zneak : Python 코드는 매우 안전하지 않기 때문에 신호 처리기에서 Python 코드를 실행할 수 없습니다. 그래서, 파이썬은 메인 쓰레드가 실행될 때까지 신호 작업을 연기합니다. 주 스레드는 바이트 코드 명령어를 페치하려고 시도 할 때 보류중인 호출을 실행합니다. – nneonneo

관련 문제