Могу ли я перестать ждать, пока потоки завершат sh, если один из них дал результаты? - PullRequest
1 голос
/ 06 августа 2020

Я делаю кучу GET-запросов примерно к нескольким сотням различных конечных точек API на разных серверах. В одной из этих конечных точек есть некоторая информация, которую я хочу получить и вернуть.

После того, как любой из этих запросов что-то вернет мне, я хочу завершить другие потоки и выйти. Некоторые запросы выполняются почти мгновенно, для некоторых может потребоваться до 20 секунд. sh.

Если я найду информацию за 2 секунды, я не хочу, чтобы прошло 20 секунд, прежде чем я смогу продолжить

В настоящее время я делаю такие вещи:

threads = list()
for s in silos: #here i create all the requests
    t = Thread(target=process_request, args=(my, args, here))
    t.name = "{} - {}".format(some, name)
    threads.append(t)

Затем я делаю:

print("Threads: {}".format(len(threads))) # 100 - 250 of them
    [ t.start() for t in threads ]
    [ t.join() for t in threads ]

process_request () просто делает запрос на получение и сохраняет результат внутри dict, если status_code == 200. Я использую модули запросов и потоковой передачи.

1 Ответ

1 голос
/ 06 августа 2020

Если вы используете многопроцессорный пул, вы можете завершить работу пула, как только поступит первый ответ:

import multiprocessing as mp
import time


pool = None


def make_get_request(inputs):
    print('Making get request with inputs ' + str(inputs))
    time.sleep(2)
    return 'dummy response for inputs ' + str(inputs)


def log_response(response):
    print("Got response = " + response)
    pool.terminate()

def main():
    global pool
    pool = mp.Pool()
    for i in range(10):
        pool.apply_async(make_get_request, args = (i,), callback = log_response)
    pool.close()
    pool.join()

if __name__ == '__main__':
    main()
...