2013-08-15 1 views

답변

0

신호는 참조 카운팅 작업 도중에 전달되어 처리 될 수 있습니다. CPython이 참조 카운팅을 위해 원자 CPU 명령어를 사용하지 않는 이유에 대해 궁금한 경우, 너무 느립니다. 원자 연산은 메모리 장벽을 사용하여 CPU 캐시 (L1, L2, 공유 L3)와 CPU (ccNUMA)를 동기화합니다. 상상할 수 있듯이 최적화가 많이되지 않습니다. 최신 CPU는 매우 빠르며 빠르며 빠르기 때문에 아무것도하지 않고 데이터를 기다리는 데 많은 시간을 소비합니다. 참조 증가 및 감소는 CPython에서 매우 일반적인 작업입니다. 메모리 장벽은 매우 중요한 최적화 트릭 인 순서가 잘못된 실행을 방지합니다.

참조 카운팅 코드는 신중하게 작성되었으며 멀티 스레딩과 신호를 고려합니다. 시그널 핸들러는 스레드가 할 수 없듯이 부분적으로 생성되거나 파괴 된 Python 객체에 액세스 할 수 없습니다. Py_CLEAR과 같은 매크로는 가장자리의 경우를 처리합니다. I/O 함수는 EINTR도 처리합니다. 3.3에는 fork()와 execvpe() 사이의 async-signal-safe 함수 만 사용하는 향상된 하위 프로세스 모듈이 있습니다.

걱정할 필요가 없습니다. 우리는 POSIX fu를 아주 잘 알고있는 영리한 사람들이 있습니다.

1

신호는 매우 간단한 신호 처리기에 의해 포착되며 사실상 주 신호 처리기 기능을 주 스레드에서 호출하도록 예약합니다. C 신호 처리기는 어떤 Python 객체에도 접촉하지 않으므로 어떤 상태도 손상시키지 않습니다. 반면 Python 신호 처리기는 바이트 코드 연산 평가 사이에서 실행되므로 CPython의 내부 상태를 손상시키지 않습니다.

관련 문제