"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > 파이썬 멀티 프로세스 풀에서 키보드 인터럽트를 처리하는 방법은 무엇입니까?

파이썬 멀티 프로세스 풀에서 키보드 인터럽트를 처리하는 방법은 무엇입니까?

2025-04-20에 게시되었습니다
검색:110

How to Handle Keyboard Interruptions in Multiprocessing Pools with Python?

문제 :

주어진 Python 코드에서 풀이 생성되고 시도 노출 블록을 사용하여 키보드 인터럽트를 처리하려고 시도합니다. 그러나 제외 블록 내의 해당 코드는 절대 실행되지 않아 프로그램이 매달려 있습니다.

try : results = pool.map (slowly_square, 범위 (40)) Keyboardinterrupt를 제외하고 : pool.terminate () 인쇄 ( "프로그램을 취소했습니다!") sys.exit (1)

원인 :
try:
    results = pool.map(slowly_square, range(40))
except KeyboardInterrupt:
    pool.terminate()
    print("You cancelled the program!")
    sys.exit(1)
이 문제는 threading.condition.wait ()의 조건을 기다릴 때 키보드 인터럽트가 전송되지 않는 Python의 버그로 인해 발생합니다. 멀티 프로세싱 라이브러리에서 풀은 조건 변수를 사용하여 MAP () 작업의 결과를 기다립니다. When a KeyboardInterrupt occurs, the condition variable wait() does not return, thus preventing the interrupt from being handled.

Solution:

To resolve this issue, a workaround is to specify a timeout when waiting for the results. 이것은 map () 호출을 map_async (). get (timeout)으로 바꾸면 타임 아웃이 큰 값으로 설정되어 있습니다. 키보드 인터럽트가 처리되지 않았습니다. 이를 통해 제외 블록을 실행할 수있어 풀의 종료와 인터럽트의 우아한 처리가 가능합니다.

릴리스 선언문 이 기사는 1729576518에 재현됩니다.
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3