>  기사  >  백엔드 개발  >  Python 다중 처리 풀에서 키보드 인터럽트를 적절하게 처리하는 방법은 무엇입니까?

Python 다중 처리 풀에서 키보드 인터럽트를 적절하게 처리하는 방법은 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-10-22 15:44:18453검색

How to Gracefully Handle Keyboard Interrupts in Python Multiprocessing Pools?

Python 다중 처리 풀에서 키보드 인터럽트의 우아한 처리

Python의 다중 처리 풀로 작업할 때 KeyboardInterrupt 이벤트를 처리하는 것이 항상 간단하지는 않습니다. 이 기사에서는 이러한 인터럽트를 처리하고 프로세스가 정상적으로 종료되도록 하는 방법을 살펴보겠습니다.

제공된 코드 샘플은 이러한 과제를 보여줍니다. KeyboardInterrupt에 대한 catch 블록이 있음에도 불구하고 control-C를 눌러도 실행되지 않습니다. 대신 프로그램은 외부에서 종료될 때까지 정지됩니다.

이 문제의 근본 원인은 threading.Condition.wait()의 조건 차단과 관련된 Python 버그에 있습니다. 이 컨텍스트에서는 KeyboardInterrupt가 전송되지 않습니다. 결과적으로 풀 내에서 인터럽트가 처리되는 것을 방지합니다.

이 문제에 대한 한 가지 해결책은 결과를 기다릴 때 시간 초과를 지정하는 것입니다. 시간 제한 매개변수가 있는 map_async() 메서드를 map() 대신 사용할 수 있습니다. 이 접근 방식을 사용하면 KeyboardInterrupt를 인식하고 처리할 수 있습니다.

<code class="python">results = pool.map_async(slowly_square, range(40)).get(9999999)</code>

큰 시간 초과 값을 설정하여 기본적으로 풀은 사용자가 중단할 때까지 결과를 계속 기다리도록 지시합니다.

이 해결 방법에는 몇 가지 제한 사항이 있다는 점에 유의하는 것이 중요합니다. 모든 작업이 완료되기 전에 제한 시간이 만료되면 완료되지 않은 결과는 삭제됩니다. 따라서 응답성과 불완전한 결과의 위험 사이에서 균형을 이루는 적절한 시간 초과 값을 선택하는 것이 중요합니다.

위 내용은 Python 다중 처리 풀에서 키보드 인터럽트를 적절하게 처리하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.