multiprocessing.Pool을 사용하고 싶지만, multiprocessing.Pool이 타임 아웃 후에 작업을 중단 할 수 없습니다. 나는 solution을 발견하고 일부는 그것을 수정합니다.파이썬 다중 처리 풀 타임 아웃
from multiprocessing import util, Pool, TimeoutError
from multiprocessing.dummy import Pool as ThreadPool
import threading
import sys
from functools import partial
import time
def worker(y):
print("worker sleep {} sec, thread: {}".format(y, threading.current_thread()))
start = time.time()
while True:
if time.time() - start >= y:
break
time.sleep(0.5)
# show work progress
print(y)
return y
def collect_my_result(result):
print("Got result {}".format(result))
def abortable_worker(func, *args, **kwargs):
timeout = kwargs.get('timeout', None)
p = ThreadPool(1)
res = p.apply_async(func, args=args)
try:
# Wait timeout seconds for func to complete.
out = res.get(timeout)
except TimeoutError:
print("Aborting due to timeout {}".format(args[1]))
# kill worker itself when get TimeoutError
sys.exit(1)
else:
return out
def empty_func():
pass
if __name__ == "__main__":
TIMEOUT = 4
util.log_to_stderr(util.DEBUG)
pool = Pool(processes=4)
# k - time to job sleep
featureClass = [(k,) for k in range(20, 0, -1)] # list of arguments
for f in featureClass:
# check available worker
pool.apply(empty_func)
# run job with timeout
abortable_func = partial(abortable_worker, worker, timeout=TIMEOUT)
pool.apply_async(abortable_func, args=f, callback=collect_my_result)
time.sleep(TIMEOUT)
pool.terminate()
print("exit")
주요 수정 - sys.exit (1)와 작업자 프로세스 종료. 그것은 작업자 프로세스를 죽이고 작업 스레드를 죽일거야,하지만 난이 솔루션이 좋다는 것을 모르겠다. 프로세스가 실행중인 작업으로 종료 될 때 발생할 수있는 잠재적 인 문제점은 무엇입니까?
당신의 작업자()에서 시간 초과를 처리하고 그 결과를 공통 콜렉션에 써주는 것이 좋을 것 같습니다. 이 방법으로 모든 스레드에서 join()을 호출 한 다음 결과를 처리하면됩니다. 시스템에 과부하가 걸리지 않으면 모든 것이 제대로 작동해야합니다. – mljli