Python의 다중 처리 풀을 사용하여 KeyboardInterrupt를 적절하게 처리하는 방법

Linda Hamilton
풀어 주다: 2024-10-22 14:23:03
원래의
603명이 탐색했습니다.

How to Gracefully Handle KeyboardInterrupt with Multiprocessing Pools in Python

다중 처리 풀의 키보드 중단 처리: Python의 함정

Python의 다중 처리 모듈에서 KeyboardInterrupt 이벤트는 풀 내의 작업자 프로세스를 종료하지 못하는 것처럼 보입니다. 다음 코드 조각을 고려해 보세요.

<code class="python">from multiprocessing import Pool
from time import sleep
from sys import exit

def slowly_square(i):
    sleep(1)
    return i*i

def go():
    pool = Pool(8)
    try:
        results = pool.map(slowly_square, range(40))
    except KeyboardInterrupt:
        # **** THIS PART NEVER EXECUTES. ****
        pool.terminate()
        print "You cancelled the program!"
        sys.exit(1)
    print "\nFinally, here are the results: ", results

if __name__ == "__main__":
    go()</code>
로그인 후 복사

Ctrl C를 눌러 KeyboardInterrupt를 발생시키면 풀이 정상적으로 종료되지 않고 코드가 무기한 중단됩니다. 이는 KeyboardInterrupt가 threading.Condition.wait()에 대한 호출을 중단하지 못하게 하는 Python 버그 때문입니다.

해결 방법:

해결 방법은 시간 초과를 지정하는 것입니다. 풀 운영을 위해. 바꾸기:

<code class="python">    results = pool.map(slowly_square, range(40))</code>
로그인 후 복사

다음으로:

<code class="python">    results = pool.map_async(slowly_square, range(40)).get(9999999)</code>
로그인 후 복사

임의로 큰 시간 제한을 지정하면 차단 동작을 효과적으로 제거하고 인터럽트가 즉시 처리되도록 할 수 있습니다. 이렇게 하면 Ctrl C를 누르면 모든 작업자 프로세스가 정상적으로 종료됩니다.

위 내용은 Python의 다중 처리 풀을 사용하여 KeyboardInterrupt를 적절하게 처리하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!