Параллельные фьючерсы ждут подмножество задач - PullRequest
0 голосов
/ 02 июня 2018

Я использую платформу Python concurrent.futures .Я использовал функцию map() для одновременного запуска задач:

def func(i):
    return i*i

list = [1,2,3,4,5]
async_executor = concurrent.futures.ThreadPoolExecutor(5)
results = async_executor.map(func,list)

Меня интересуют только первые n результаты, и я хочу остановить исполнителя после завершения первых потоков nгде n - это число меньше размера списка ввода.Есть ли способ сделать это в Python?Есть ли еще какие-то рамки, на которые я должен посмотреть?

1 Ответ

0 голосов
/ 02 июня 2018

Вы не можете использовать map() для этого, потому что он не дает возможности перестать ждать результатов, ни каким-либо способом получить отправленные фьючерсы и отменить их.Однако вы можете сделать это, используя submit():

import concurrent.futures
import time

def func(i):
    time.sleep(i)
    return i*i


list = [1,2,3,6,6,6,90,100]
async_executor = concurrent.futures.ThreadPoolExecutor(2)
futures = {async_executor.submit(func, i): i for i in list}
for ii, future in enumerate(concurrent.futures.as_completed(futures)):
    print(ii, "result is", future.result())
    if ii == 2:
        async_executor.shutdown(wait=False)
        for victim in futures:
            victim.cancel()
        break

Для запуска приведенного выше кода требуется около 11 секунд - он выполняет задания [1,2,3,6,7], но не остальные.

...