문제 :
주어진 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)으로 바꾸면 타임 아웃이 큰 값으로 설정되어 있습니다. 키보드 인터럽트가 처리되지 않았습니다. 이를 통해 제외 블록을 실행할 수있어 풀의 종료와 인터럽트의 우아한 처리가 가능합니다.부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3