• Асинхронность asyncio в Python Что не так?

    @ig_mln Автор вопроса
    Спасибо за обратную связь. Но я или не туда вставляю time.sleep(2)...но не работает...И скорость выполнения упала..Асинхронности нет...После длительного ожидания все равно из 50 тасков - 42 корректные- остальные с ошибкой:: 'Too many requests per second'
    При увеличение тасков - увеличивается количество ошибок не говоря уже о 3200 тасков
    Вот где я использовал задержку:
    import asyncio
    from aiohttp import ClientSession
    import json
    import nest_asyncio
    
    nest_asyncio.apply()
    
    list_token=[]
    with open('tokens.txt', 'r') as f:
        for line in f:
            list_token.append(str(line).rstrip('\n'))
    len(list_token)
    list_data=[]
     
    async def bound_fetch_zero(sem,id,session):
            async with sem:
                await fetch_zero(id,session)
     
     
    async def fetch_zero(id, session):
        url = build_url(id)
        try:
            time.sleep(2) # Задержка
            async with session.get(url) as response:
    
                    # Считываем json
                    resp=await response.text()
                    js=json.loads(resp)
                    list_users=[x for x in js['response'] if x != False]
    
                    # Проверяем если город=1(Москва) тогда добавляем в лист
                    for it in list_users:
                        try:
                            if it[0]['city']['id']==1:
                                    list_data.append(it[0]['id'])
                        except Exception:
                            pass
     
        except Exception as ex:
            print(f'Error: {js}')
     
    #  Генерация url к апи вк, 25 запросов в одном
    def build_url(id):
        api = 'API.users.get({{\'user_ids\':{},\'fields\':\'city\'}})'.format(
            id * 25 + 1)
        for i in range(2, 26):
            api += ',API.users.get({{\'user_ids\':{},\'fields\':\'city\'}})'.format(
                id * 25 + i)
        url = 'https://api.vk.com/method/execute?access_token={}&v=5.101&code=return%20[{}];'.format(
            list_token[id%len(list_token)], api)
        return url
     
     
    async def run_zero(id):
        tasks = []
        sem = asyncio.Semaphore(1000)
     
        async with ClientSession() as session:
     				
          	#  Значение 3200 зависит от вашего числа токенов 
            for id in range((id - 1) * 3200, id * 3200):
                task = asyncio.ensure_future(bound_fetch_zero(sem,id, session))
                tasks.append(task)
     
            responses = asyncio.gather(*tasks)
            await responses
            del responses
            await session.close()
     
    # Запускаем  сборщик
    for i in range(0,17):
      for id in range(i*500+1,(i+1)*500+1):
          print(id)
          loop = asyncio.new_event_loop()
          asyncio.set_event_loop(loop)
          loop.run_until_complete(run_zero(id))
          
      # Сохраняем айдишники в файл и очищаем лист
      with open(f'data_main{i}.txt', 'w') as f:
                for item in list_data:
                  f.write(f'{item}\n')
    
      print(len(list_data))
      list_data.clear()
  • Асинхронность asyncio в Python Что не так?

    @ig_mln Автор вопроса
    Да куда я только "await asyncio.sleep()" не пихал..не помогает. Процентов 20 отдает нормально json, остальное ошибка: 'Too many requests per second'
  • Асинхронность asyncio в Python Что не так?

    @ig_mln Автор вопроса
    Да все верно,но где в коде ошибка? Пожалуйста, помогите...