Как я могу многопоточность 3 различных функций, которые возвращают одно и то же значение и выбрать самый быстрый - PullRequest
0 голосов
/ 02 ноября 2018

Я использую модуль потоков и имею 3 разные функции, в которых они возвращают одно и то же значение, но используют разные методы для возврата этого значения.

Я хочу и ID и назову его my_id

Например:

Функция # 1: очистить веб-сайт с помощью мобильной конечной точки и проанализировать json для my_id

Функция # 2: очистить веб-сайт с помощью конечной точки рабочего стола и проанализировать json для my_id

Функция # 3: очистить HTML-код веб-сайта рабочего стола и найти my_id

То, что я хотел бы сделать, - это запускать каждую функцию одновременно, и в зависимости от того, какая из них вернет my_id быстрее, я беру ее и продолжаю код.

Как лучше всего это сделать?

1 Ответ

0 голосов
/ 02 ноября 2018

Вы можете использовать concurrent.futures.

Создайте три потока и запустите их, используя concurrent.futures.Executor.submit() Это возвращает вам будущие объекты для каждого потока.

Тогда вы можете

concurrent.futures.wait(fs, timeout=None, return_when=FIRST_COMPLETED)

, который будет блокировать основной поток, пока не завершится один из 3 дочерних потоков.

Тогда вы можете пойти дальше и использовать свой результат.

concurrent.futures.wait Returns a named 2-tuple of sets. The first set, named done and not_done

Вы можете получить свой результат из завершенного объекта фьючерсов, используя метод result (), и вы можете безопасно завершить работу исполнителя, используя Executor.shutdown ()

Вы можете добавлять свои объекты в список и запускать их следующим образом: futures = [] for task in task_list: futures.append(executor.submit(task.run)) concurrent.futures.wait(futures,timeout=None,return_when=FIRST_COMPLETED)

...