fbpx

Python async error TimeOutError

445 просмотра
0
0 Комментариев

Имеется ошибка

Traceback (most recent call last):
  File "D:/Учеба/Диплом/parsers/smartphone/test7.py", line 142, in <module>
    event_loop.run_until_complete(main(url_select_city))
  File "C:\ProgramData\Anaconda3\lib\asyncio\base_events.py", line 467, in run_until_complete
    return future.result()
  File "D:/Учеба/Диплом/parsers/smartphone/test7.py", line 124, in main
    item= item.result()
  File "D:/Учеба/Диплом/parsers/smartphone/test7.py", line 74, in parse_list_object
    r=await request(client,url,limit)
  File "D:/Учеба/Диплом/parsers/smartphone/test7.py", line 20, in request
    return await r.text()
  File "C:\ProgramData\Anaconda3\lib\site-packages\aiohttp\client_reqrep.py", line 848, in text
    await self.read()
  File "C:\ProgramData\Anaconda3\lib\site-packages\aiohttp\client_reqrep.py", line 815, in read
    self._body = await self.content.read()
  File "C:\ProgramData\Anaconda3\lib\site-packages\aiohttp\streams.py", line 312, in read
    block = await self.readany()
  File "C:\ProgramData\Anaconda3\lib\site-packages\aiohttp\streams.py", line 328, in readany
    await self._wait('readany')
  File "C:\ProgramData\Anaconda3\lib\site-packages\aiohttp\streams.py", line 250, in _wait
    await waiter
  File "C:\ProgramData\Anaconda3\lib\site-packages\aiohttp\helpers.py", line 670, in __exit__
    raise asyncio.TimeoutError from None
concurrent.futures._base.TimeoutError

Как я понял, ошибка возникает из-за нехватки времени на завершение всех задач. Количество задач около 7K. Как убрать это ограничение?

async def get_html(request):
    return lxml.html.fromstring(request)
 
async def request(client,url,limit):
    with(await limit):
        async with client.get(url) as r:
            print(r.status)
            return await r.text()
 
 
async def request_json(client,url):
    async with client.get(url) as r:
        return await r.json()
sem=asyncio.Semaphore(500)
async def main(urls):
    ...
    async with aiohttp.ClientSession() as client:
        coroutines2=[parse_list_object(client, url_object,limit=sem) for url_object in list_objects]
        completed, pending=await asyncio.wait(coroutines2)
        url_object=[]
        for item in completed:
            item= item.result()
            url_object+=item
        print(len(url_object))
 
if __name__ == '__main__':
 
    log = logging.getLogger(__name__)
    format = '%(asctime)s %(levelname)s:%(message)s'
    logging.basicConfig(format=format, level=logging.INFO)
    log.info("Start")
 
 
    # получаем экзепляр цикла событий
    event_loop = asyncio.get_event_loop()
 
    try:
        t_start = time.time()
        # запуск цикла  обработки событий
        event_loop.run_until_complete(main(url_select_city))
        t_end = time.time()
        log.info("Time End: %s", t_end - t_start)  # 3.042086362838745
    finally:
        # обязательно закрываем
        event_loop.close()


Добавить комментарий

1 Ответы

Python Опубликовано 27.03.2019
0

В метод get() можно передать параметр timeout

async with client.get(url, timeout=None) as r:
    return await r.text()

Добавить комментарий
Напишите свой ответ на данный вопрос.
Scroll Up