Как остановить потоки при получения данных отличных от None хотя бы из 1 потока?
Есть кусок функции.
Сейчас в data_list
попадают в пересмешку и данные и None
.
Нужно сделать так, чтобы при попадании первых данных (не None
) в data_list
мы не дожидались выполнения остальных потоков.
def check_site(self, log):
site = ['https://yandex.ru/internet', 'https://wtfismyip.com', 'https://whoer.net', 'https://2ip.ru']
with ThreadPoolExecutor(max_workers=50) as pool:
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
futures = [loop.run_in_executor(pool, check_site, self.user, self.password, self.ip, self.port,
self.protocol, url, log) for url in site]
data_list = loop.run_until_complete(asyncio.gather(*futures))
Необходимо также отметить, что запросы отправляются через curl в формате:
curl -x http://usbW1q:fE3U35@193.111.5.203:8000 https://8.8.8.8 -w %{time_connect}
Может я что то не так делаю(((
Вот функция где я делаю futures
и вызывают функцию wait_first_completed_not_none
async def check_dns(self, log):
dns = ['https://google.com', 'https://208.67.222.222']
protocols = ['http', 'socks5']
futures = [asyncio.create_task(check_dns_no_class(self.user, self.password, self.ip, self.port, url, protocol,
log)) for url in dns for protocol in protocols]
data = await wait_first_completed_not_none(futures)
и в data
попадают данные которые были первыми получены только при выполнении всех futures
и все futures
выполняются по очереди
а тут я вызываю функцию proxy.check_dns
def run(proxy_attr, log, connection):
proxy = Proxy(proxy_attr[0], proxy_attr[1], proxy_attr[2], proxy_attr[3])
log.info(f'Check proxy: {proxy.ip}:{proxy.port}:{proxy.user}:{proxy.password}')
id_proxy = add_proxy_to_database(connection, proxy)
log.info(f'Proxy: {proxy.ip}:{proxy.port}:{proxy.user}:{proxy.password} add database')
asyncio.run(proxy.check_dns(log))