@vitalysokolov

Почему не приходит результат post-запроса (aiohttp, asyncio)?

Запутался в asyncio. Объясните, почему ответ от get_response() не приходит? И почему в task_check_website() игнорируется цикл while True, т.е. обращение к get_response() происходит однократно, ответа нет, и нормально отрабатывает только dummy_task(), в которой while True работает как надо.

async def get_response(self, url, use_proxy=True, *args, **kwargs):
	        for _ in range(0, 60):
	            _headers = {
	                ...
	            }
	            if use_proxy:
	                _proxy = self.get_proxy()
	            else:
	                _proxy = {}

	            try:
	                async with aiohttp.ClientSession() as sess:
	                    async with sess.post(url, headers=_headers, proxy=_proxy, *args, **kwargs) as response:
	                        r = await response.text()
	                    if response.status > 399:
	                        raise ScraperError(response.status)
	                    await sleep(0.1)
	                    return r
	            except (aiohttp.ClientError, ScraperError) as err:
	                await sleep(0.5)
	                continue
	        return None


    async def dummy_task(self):
        j = 0
        while True:
            print("%ds" % j)
            await sleep(1)
            j += 1
			
			
	async def task_check_website(self):
	        while True:
	            _data = {
	                "next": "Next",
	                "id": str(self.data["task"]["type_id"]),
	            }  # deb
	            r = await self.get_response(self.data["curr_url"], data=_data)
	          	await sleep(1)


    async def run(self): 
		
        self.data["worker"]["tasks"].append(asyncio.create_task(self.task_check_website()))
        self.data["worker"]["tasks"].append(asyncio.create_task(self.dummy_task()))
        await asyncio.gather(*self.data["worker"]["tasks"], return_exceptions=True)
  • Вопрос задан
  • 222 просмотра
Пригласить эксперта
Ответы на вопрос 1
@davGro
Шушуть люблю питон, по шушуть тыкаю где-то год.
Вероятно Ваш цикл игнорируется, потому что с разметкой у вас все худо

# ваш код
  async def task_check_website(self):
          while True:
              _data = {

# правильная разметка
    async def task_check_website(self):
        while True:
            _data = {

Разница заметна, не так ли?
Используйте правильное количество пробелов, на каждом уровне по 4, перед циклом в вашем случае должно быть 8 пробелов, тем более это влияет на читаемость кода.

Проблема с разметкой у вас не только в этой функции, dummy_task у вас также на непонятном уровне. Не используйте табы, используйте по 4 пробела вместо табов. В ином случае ваш интерпретатор выдаст вам ошибку
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы