>source

코드에 스레드 예외를 추가하는 방법은 무엇입니까? 예를 들어 함수 fx (첫 번째 스레드)가 10 초 이상을 계산하는 경우

e1 = threading.Event()
e2 = threading.Event()
e3 = threading.Event()
# init threads
t1 = threading.Thread(target=fx, args=(x, e1, e2))
t2 = threading.Thread(target=gx, args=(x, e2, e3))
t3 = threading.Thread(target=func, args=(e3, e1))
t1.start()
t2.start()
t3.start()
e1.set() #initiate the first event
t1.join()
t2.join()
t3.join()

  • 답변 # 1

    ThreadPoolExecutor 사용을 고려할 수 있습니다  와이즈 비즈   concurrent.futures 대신 모듈 . 예 :

    threading.Thread
    
    

    이 예에서 모든 스레드는 실행 시간이 10 초로 제한됩니다. 10 초 이상 실행 된 Future의 결과를 얻을 때 TimeoutError가 발생합니다.

    개별 스레드에 시간 제한을 둘 수도 있습니다. 예 :

    e1 = threading.Event()
    e2 = threading.Event()
    e3 = threading.Event()
    with ThreadPoolExecutor(max_workers=3) as executor:
        futures = {
            executor.submit(fx, x, e1, e2): 1,
            executor.submit(gx, x, e2, e3): 2,
            executor.submit(func, x, e3, e1): 3
        }
    e1.set() #initiate the first event
    for ft in concurrent.futures.as_completed(futures, timeout=10):
        i = futures[ft]
        try:
            data = ft.result()
        except Exception as e:
            print('Call %d generated an exception: %s' % (i, e))
    
    

    e1 = threading.Event() e2 = threading.Event() e3 = threading.Event() with ThreadPoolExecutor(max_workers=3) as executor: ft1 = executor.submit(fx, x, e1, e2) ft2 = executor.submit(gx, x, e2, e3) ft3 = executor.submit(func, x, e3, e1) e1.set() #initiate the first event try: data = ft1.result(timeout=10) except Exception as e: print('Call generated an exception: %s' % e)

관련 자료

  • 이전 javascript - 속성에 삼중 따옴표로 HTML 추가
  • 다음 javascript - Vuejs 용 ckeditor 컴포넌트의 insertText ()