Windows에서 Python 3.5.2를 사용하고 있습니다.파이썬에서 자식 스레드 내에서 부모 스레드를 죽일 수 있습니까?
파이썬 스크립트를 실행하고 싶지만 N 초 이상 걸리지 않도록하십시오. 이 일 경우 N 초 이상 걸릴 경우 예외가 발생하고 프로그램을 종료해야합니다. 처음에는 예외를 던지기 전에 N 초를 기다리는 스레드를 처음 시작할 수 있다고 생각했지만,이 작업은 상위 스레드가 아니라 타이머 스레드에 예외를 던지기 만합니다.
import threading
import time
def may_take_a_long_time(name, wait_time):
print("{} started...".format(name))
time.sleep(wait_time)
print("{} finished!.".format(name))
def kill():
time.sleep(3)
raise TimeoutError("No more time!")
kill_thread = threading.Thread(target=kill)
kill_thread.start()
may_take_a_long_time("A", 2)
may_take_a_long_time("B", 2)
may_take_a_long_time("C", 2)
may_take_a_long_time("D", 2)
이 출력 : 예를 들어
A started...
A finished!.
B started...
Exception in thread Thread-1:
Traceback (most recent call last):
File "C:\Program Files\Python35\lib\threading.py", line 914, in _bootstrap_inner
self.run()
File "C:\Program Files\Python35\lib\threading.py", line 862, in run
self._target(*self._args, **self._kwargs)
File "timeout.py", line 11, in kill
raise TimeoutError("No more time!")
TimeoutError: No more time!
B finished!.
C started...
C finished!.
D started...
D finished!.
이 가능한 원격 짝수? 나는 이런 식으로 뭔가를 할 수 실현 :
import threading
import time
def may_take_a_long_time(name, wait_time, thread):
if not thread.is_alive():
return
print("{} started...".format(name))
time.sleep(wait_time)
print("{} finished!.".format(name))
def kill():
time.sleep(3)
raise TimeoutError("No more time!")
kill_thread = threading.Thread(target=kill)
kill_thread.start()
may_take_a_long_time("A", 2, kill_thread)
may_take_a_long_time("B", 2, kill_thread)
may_take_a_long_time("C", 2, kill_thread)
may_take_a_long_time("D", 2, kill_thread)
그러나이 방법은 예를 들어, may_take_a_long_time("B", 60, kill_thread)
가 호출, 경우에 실패합니다.
그래서 내 TL; DR 질문은, 메인 스레드 자체에 시간 제한을 두는 가장 좋은 방법은 무엇입니까?
당신은 모든 파이썬 스레드를 _kill_ 수 없습니다. 이를위한 API가 없습니다. 그리고 코드에서 수행중인 작업은 새로운 thread_ 내에서 예외를 발생시키는 것일 뿐이므로 메인 스레드에는 영향을 미치지 않습니다. – ForceBru
시간 제한의 목적은 무엇입니까? 특정 시간 이상 동안 어떤 일이 일어날 때까지 기다리지 않으려면 대기를 그만 두십시오. –
@ForceBru 나는 그것이 주된 것에 영향을 미치지 않는다는 것을 안다. 그것은 나의 문제이다. 이것은 나의 초기 순진 구현이었다. 일련의 함수 ('may_take_a_long_time')가 ** N ** 초 이상 걸리지 않도록하는 방법을 찾으려고합니다. – DJMcMayhem