我有下面的代码,在这里我尝试用不同的超时调用函数。第一个函数可能超时,但第二个函数可能在指定的时间内执行。
import time
from concurrent.futures import ThreadPoolExecutor
def test1(a, b, c):
time.sleep(5)
d=a+b+c
print(d)
def test2(a, b):
time.sleep(5)
d=a+b
print(d)
with ThreadPoolExecutor(max_workers=1) as executor1:
try:
executor1.submit(test1, 1,2,3).result(timeout=1)
except:
executor1.shutdown(wait=False)
print("Pass")
with ThreadPoolExecutor(max_workers=1) as executor2:
try:
executor2.submit(test2, 1,2).result(timeout=8)
except:
executor2.shutdown(wait=False)
print("Pass-2")预期输出
Pass
3实际输出
Pass
6
3我想要的是,只要有一个executor,就停止第一个timeout的执行。然后继续下一个executor。
发布于 2021-01-27 16:00:42
最后,利用this link实现了该系统。最终代码共享如下:
import time
from concurrent.futures import ThreadPoolExecutor
import ctypes
def terminate_thread(thread):
"""Terminates a python thread from another thread.
:param thread: a threading.Thread instance
"""
if not thread.isAlive():
return
exc = ctypes.py_object(SystemExit)
res = ctypes.pythonapi.PyThreadState_SetAsyncExc(
ctypes.c_long(thread.ident), exc)
if res == 0:
raise ValueError("nonexistent thread id")
elif res > 1:
# """if it returns a number greater than one, you're in trouble,
# and you should call it again with exc=NULL to revert the effect"""
ctypes.pythonapi.PyThreadState_SetAsyncExc(thread.ident, None)
raise SystemError("PyThreadState_SetAsyncExc failed")
def test1(a, b, c):
time.sleep(5)
d=a+b+c
print(d)
def test2(a, b):
time.sleep(5)
d=a+b
print(d)
with ThreadPoolExecutor(max_workers=1) as executor:
try:
executor.submit(test1, 1,2,3).result(timeout=1)
except:
executor.shutdown(wait=False)
for t in executor._threads:
terminate_thread(t)
print("Pass")
with ThreadPoolExecutor(max_workers=1) as executor:
try:
executor.submit(test2, 1,2).result(timeout=8)
except:
executor.shutdown(wait=False)
for t in executor._threads:
terminate_thread(t)
print("Pass-2")https://stackoverflow.com/questions/65922433
复制相似问题