【发布时间】:2021-10-14 02:06:48
【问题描述】:
我正在尝试根据从长时间运行的请求返回的值终止 ThreadPool。一旦请求返回值的总和达到MIN_REQUIRED_VALUE,我希望终止线程池
我确信问题在于我正在创建一个完整的期货列表,而这些期货总是必须得到解决。我不确定如何在不使用 ThreadPoolExecutor 创建列表的情况下执行请求
我知道有几个与终止线程池相关的问题。我发现了类似的问题,但答案似乎无法处理返回值。
类似问题:
- Python ThreadPoolExecutor terminate all threads
- asyncio: Is it possible to cancel a future been run by an Executor?
如果有更好的方法可以用另一个模块做到这一点,那很好。
任何帮助将不胜感激。
from time import sleep
from concurrent.futures import ThreadPoolExecutor, as_completed
NUM_REQUESTS = 50
MIN_REQUIRED_VALUE = 30
def long_request(id):
sleep(3)
return {"data": {"value": 10}}
def check_results(results):
total = 0
for result in results:
total += result["data"]["value"]
return total
def main():
futures = []
responses = []
with ThreadPoolExecutor(max_workers=10) as executor:
for request_index in range(NUM_REQUESTS):
future = executor.submit(long_request, request_index)
# Create Futures List
futures.append(future)
for future in as_completed(futures):
responses.append(future.result())
# Check minimum value reached
total = check_results(responses)
if total > MIN_REQUIRED_VALUE:
executor.shutdown(wait=False)
if __name__ == "__main__":
main()
【问题讨论】:
标签: python multithreading concurrency threadpool python-multithreading