2011-01-05 4 views
5

토론 Signal handlers and logging in Python 파이썬에서 함수가 재진입하는 질문은 내 마음 속에 떠 올랐습니다.신호 라이브러리 처리를 위해 파이썬에서 재진입하는 함수는 무엇입니까?

signal library 언급 : 파이썬 신호 처리기가 비동기 적으로 멀리 파이썬 사용자에 관한 한 라고하지만

, 그들은 는 파이썬 인터프리터의 원자 지침 사이에 발생할 수 있습니다. 즉, 이 긴 계산 중에 도착하면 임의의 시간 동안 지연 될 수 있습니다 (예 : 큰 본문의 정규 표현식 일치와 같이) C로만 구현 된 이 지연 될 수 있습니다.

다시 입구로 지적되고 일반적이지 않습니다

logging library :

당신이 신호 모듈을 사용하여 비동기 신호 처리기를 구현하는 경우, 당신은에서 로깅을 사용할 수 없습니다 그러한 핸들러 내에서. 스레딩 모듈의 잠금 구현 이 항상 re-entrant가 아니므로 해당 신호 처리기에서 을 호출 할 수 없기 때문입니다.

신호 라이브러리가 GIL (전역 해석기 잠금)에 대해 ".. 원자 명령어 사이에서 .."라고 말하기 때문에 약간 혼란 스럽습니다. 이 경우 GIL이/잠금을 해제하자마자 신호가 연기되고 실행됩니다.. 신호 대기열의 일종.

의미가

하지만이 -limitation은 "재진입"과 실제 POSIX 신호 처리기 내에서 호출되지 않기 때문에 그것은 연기 신호 처리기가 호출하는 기능이있는 경우 재입 중요하지 않습니다 : POSIX C 기능

만 정의 목록 재진입 로 선언하고 POSIX 신호 처리기 내에서 호출 될 수있다. IEEE Std 1003.1 목록 https://www.opengroup.org/ ( 로그인 필요)에 이있는 118 개의 재진입 UNIX 함수가 나열되어 있습니다.

답변

2

나는 무엇을 로깅 모듈이 아닌 재진입을 만드는 것은 그것 (대신 RLock의)는 threading.Lock를 사용하는 것과 동일한 핸들러 (그래서 메시지 interweaved하지 않음)에 로그인 한 여러 스레드를 동기화 할 수 있다고 믿습니다.

잠금을 획득 한 로깅 호출이 신호 처리기에 의해 인터럽트되고 신호 처리기가 기록하려고 시도하면 이전 acquire이 릴리스되기를 영원히 기다리고 교착 상태가됩니다.

이러한 잠금은 길과는 아무런 관계가 없습니다. 잠금은 사용자를 위해 만들어졌습니다. GIL은 인터프리터에서 사용하는 잠금입니다 (구현 세부 정보).

+0

파이썬 2.7.1 릴리스를 확인 했으므로 가정이 잘못되었습니다.http://svn.python.org/view/python/tags/r271/Lib/logging/__init__.py?revision=86833&view=markup –

+0

에있는'_acquireLock()'함수를 확인하십시오. 실제로 수정되었습니다. 실제로' RLock'. 그것을 찾아 주셔서 감사합니다. 그러나 문서에 따르면 구현이 항상 재진입 적이는 않을 수 있습니다. "이것은 스레드 모듈의 잠금 구현이 항상 재진입 적이기 때문에 발생합니다"(http://docs.python.org/library/logging.html). # thread-safety) – albertov

+0

이것은 내가 내 질문에서 언급 한 것이다. 스레딩 라이브러리를 사용하는 각 모듈은 * 실제 * POSIX 신호 처리기에서 사용된다는 의미에서 재진입 성이 없다는 것을 알 수 있습니다. 그러나 파이썬은 신호 처리를 연기하지 않습니까? –

관련 문제