@frendri

Как делать запросы в многопотоке с определенным промежутком времени?

Добрый день. Столкнулся с проблемой, гуглил, но не нашел решения именно моей проблемы.
Нужно написать скрипт так, чтобы он делал запросы каждый определенный промежуток времени и потом когда придет ответ добавлял ответ запроса в массив. Допустим у меня 10 сессий. И нужный промежуток времени между запросами мне: 0,2 секунды. Значит мне нужно чтобы 1 из сессий отправляла запрос раз в 0,2 секунды(Если ответ не поступил, а 0,2 секунды уже прошло, начинался новый запрос другой сессии, но ответ в этом потоке еще ожидался). И в результате чтобы скрипт отправлял 10 запросов за 2 секунды с разных сессий и потом цикл начинался заново
Прочитал вот здесь: Python многопоточность Requests, что блокирует обработку?, но как я понял опять же здесь пока не придет ответ на запрос, не начнется новый запрос.
Попробовал вот так:
def multi_parse(self):
		self.ticker = 1
		self.parse_info = []
		with concurrent.futures.ThreadPoolExecutor(max_workers=1) as executor:
			executor.map(self.thread_parse, self.multisession)

	def thread_parse(self, session):
		print(f'Делаю запрос #{self.ticker} {t.time()}')
		thread_local.session = session
		multi_session = thread_local.session
		req = multi_session.get("", timeout=5).json()
		
		self.parse_info.append(req)
		t.sleep(0.2)
		print(f'Завершил запрос #{self.ticker}')
		self.ticker += 1

Но тут все запросы отправляются в одно время.
  • Вопрос задан
  • 90 просмотров
Пригласить эксперта
Ответы на вопрос 1
tumbler
@tumbler Куратор тега Python
бекенд-разработчик на python
Я бы сделал так:
Создал бы пул очередей (10 штук), на каждую запустил бы по потоку, который бы ждал сообщения из очереди и запускал бы нужный запрос. А в основном потоке раз в 0.2 секунды пулял бы по 1 запросу в одну очередь в цикле, на каждой итерации переходя к следующей очереди. Итого, все запросы координируются через общий "писатель", а "читатели" обрабатывают ответы каждый в своем потоке.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы