Asyncio: добавление возвращаемых значений в список - PullRequest
0 голосов
/ 02 апреля 2020

Я пытаюсь реализовать asyncio в ранее работающей программе, но мои функции возвращают сопрограммы вместо ожидаемых объектов.

Пример:

async def requester(things):

    async def adder(item):
        output = {}
        output['timestamp'] = datetime.datetime.now().timestamp()
        output['key'] = item
        return output

    to_insert = []
    for thing in things:
        to_insert.append(adder(thing))

    mongodbcollection.insert_many(to_insert) # This throws the error

loop = asyncio.get_event_loop()
loop.run_until_complete(requester(['a', 'b', 'c']))

В этом примере вместо объекты возвращаются из функции сумматора, сопрограммы возвращаются, и, естественно, когда я пытаюсь вставить их в базу данных, он выдает TypeError: document must be an instance of dict, bson.son.SON, bson.raw_bson.RawBSONDocument, or a type that inherits from collections.MutableMapping. В каждой из этих функций происходят другие асинхронные вещи, поэтому они асин c. Как я могу заставить эту внутреннюю функцию возвращать объект как задумано?

1 Ответ

1 голос
/ 02 апреля 2020

Вы должны использовать await для выполнения сопрограммы и получить результат выполнения:

to_insert = []
for thing in things:
    res = await adder(thing)
    to_insert.append(res)

Также есть шанс, что также следует ожидать insert_many если это сопрограмма.

...