Выполнение HTTP-запросов с использованием Asyncio - PullRequest
0 голосов
/ 15 октября 2019

Следующая функция должна отправлять запрос асинхронно:

Нет. строк в devices.csv = 1 миллион

Обязательно: отправка запроса POST для всех 1 миллиона строк в день в течение 3 дней

def check_in():
    logging.info('Starting')
    day = 0
    while day < 3:
        logging.info('Check-in Day = ' + str(day))
        with open('devices.csv', newline='') as csvfile: 
            reader = csv.DictReader(csvfile)
            for row in reader:
                device_sn = row['serial_number']
                payload = {
                    "product": "##",
                    "board": "###",
                    "hardware_id": "0000",
                    "usage_id": "000",
                    "mac_address": row['mac_address'],
                    "serial_number": row['serial_number']
                }
                logging.info(
                    'Check-in device: ' + device_sn)
                checkin_post(payload, device_sn)
            day += 1
def checkin_post(payload, device_sn):
    payload = payload
    serial_number = device_sn

    print('\n' + 72 * '=' + '\nPOST /device/' +
          serial_number + '/check-in')

    resp = requests.post(base_url + '/device/' +
                         serial_number + '/check-in', auth=auth, json=payload)

    print(resp.status_code)

Код может измениться на что-то вроде:

async def checkin_post(payload, device_sn):

    payload = payload
    serial_number = device_sn

    print('\n' + 72 * '=' + '\nPOST /device/' +
          serial_number + '/check-in')

    resp = requests.post(base_url + '/device/' +
                         serial_number + '/check-in', auth=auth, json=payload)
    return resp.status_code


async def main(payload, device_sn):
    checkin_post(payload, device_sn)

Кроме того, поскольку await нет, он не является действительно асинхронным.

1 Ответ

1 голос
/ 15 октября 2019

Извините за поздний ответ, если вы уже исправили это. Но вам нужно вернуть объект sure_future. Можете ли вы попробовать следующий код:

async def check_in():
    logging.info('Starting')
    count = 0
    futures = []
    while count < 3:
        logging.info('Check-in Day = ' + str(count))
        with open('devices.csv', newline='') as csvfile:
            reader = csv.DictReader(csvfile)
            for row in reader:
                device_sn = row['serial_number']
                payload = {
                    "product": "##",
                    "board": "###",
                    "hardware_id": "0000",
                    "usage_id": "000",
                    "mac_address": row['mac_address'],
                    "serial_number": row['serial_number']
                }
                logging.info(
                    'Check-in device: ' + device_sn)
                async with aiohttp.ClientSession() as session:
                    async with session.post(base_url + '/device/' + device_sn + '/check-in', auth=auth, json=payload) as resp:
                        futures.append(asyncio.ensure_future(await resp.status))
            count += 1
    return await asyncio.gather(*futures)

def main():
    loop = asyncio.get_event_loop()
    futures = asyncio.ensure_future(check_in())
    responses = loop.run_until_complete(futures)
...