토론 Signal handlers and logging in Python 파이썬에서 함수가 재진입하는 질문은 내 마음 속에 떠 올랐습니다.신호 라이브러리 처리를 위해 파이썬에서 재진입하는 함수는 무엇입니까?
signal library 언급 : 파이썬 신호 처리기가 비동기 적으로 멀리 파이썬 사용자에 관한 한 라고하지만
이다시 입구로 지적되고 일반적이지 않습니다, 그들은 는 파이썬 인터프리터의 원자 지침 사이에 발생할 수 있습니다. 즉, 이 긴 계산 중에 도착하면 임의의 시간 동안 지연 될 수 있습니다 (예 : 큰 본문의 정규 표현식 일치와 같이) C로만 구현 된 이 지연 될 수 있습니다.
당신이 신호 모듈을 사용하여 비동기 신호 처리기를 구현하는 경우, 당신은에서 로깅을 사용할 수 없습니다 그러한 핸들러 내에서. 스레딩 모듈의 잠금 구현 이 항상 re-entrant가 아니므로 해당 신호 처리기에서 을 호출 할 수 없기 때문입니다.
신호 라이브러리가 GIL (전역 해석기 잠금)에 대해 ".. 원자 명령어 사이에서 .."라고 말하기 때문에 약간 혼란 스럽습니다. 이 경우 GIL이/잠금을 해제하자마자 신호가 연기되고 실행됩니다.. 신호 대기열의 일종.
의미가하지만이 -limitation은 "재진입"과 실제 POSIX 신호 처리기 내에서 호출되지 않기 때문에 그것은 연기 신호 처리기가 호출하는 기능이있는 경우 재입 중요하지 않습니다 : POSIX C 기능
만 정의 목록 재진입 로 선언하고 POSIX 신호 처리기 내에서 호출 될 수있다. IEEE Std 1003.1 목록 https://www.opengroup.org/ ( 로그인 필요)에 이있는 118 개의 재진입 UNIX 함수가 나열되어 있습니다.
파이썬 2.7.1 릴리스를 확인 했으므로 가정이 잘못되었습니다.http://svn.python.org/view/python/tags/r271/Lib/logging/__init__.py?revision=86833&view=markup –
에있는'_acquireLock()'함수를 확인하십시오. 실제로 수정되었습니다. 실제로' RLock'. 그것을 찾아 주셔서 감사합니다. 그러나 문서에 따르면 구현이 항상 재진입 적이는 않을 수 있습니다. "이것은 스레드 모듈의 잠금 구현이 항상 재진입 적이기 때문에 발생합니다"(http://docs.python.org/library/logging.html). # thread-safety) – albertov
이것은 내가 내 질문에서 언급 한 것이다. 스레딩 라이브러리를 사용하는 각 모듈은 * 실제 * POSIX 신호 처리기에서 사용된다는 의미에서 재진입 성이 없다는 것을 알 수 있습니다. 그러나 파이썬은 신호 처리를 연기하지 않습니까? –