Как использовать asyn c до l oop над списком и вызывать собственную функцию объекта списка - PullRequest
0 голосов
/ 03 марта 2020

Как я могу l oop просмотреть список объектов asyn c и вызвать их функцию. Например:

class Cat:
    def talk():
        print("Meow")

class Dog:
    def talk():
        print("Woof")


cat = Cat()
dog = Dog()

animal_list = [cat, dog]

# How would I do these async?
for animal in animal_list:
    animal.talk()

Этот поток, Как использовать asyn c для l oop для перебора списка? , рекомендует использовать asyncio, но не пример как я могу вызвать объект, это его собственная функция, такая как animal.talk()

1 Ответ

0 голосов
/ 10 марта 2020

Сделайте функции разговора асинхронными c, иначе нет смысла использовать asyncio.

class Cat:
    async def talk():
        print("Meow")

class Dog:
    async def talk():
        print("Woof")


cat = Cat()
dog = Dog()

animal_list = [cat, dog]

Создать список (Iterable) сопрограмм, возвращаемых animal.talk().

Любой coroutines = map(lambda animal : animal.talk(), animal_list) или coroutines = [animal.talk() for animal in animal_list] сделает.

Затем, наконец, запланирован список сопрограмм для выполнения.

# This returns the results of the async functions together.
results = await asyncio.gather(coroutines)

# This returns the results one by one.
for future in asyncio.as_completed(coroutines):
    result = await future

cat.talk() и dog.talk() будут выполняться асинхронно, что означает порядок их выполнения не гарантируется, и может выполняться на разных потоках. Но здесь функция talk настолько проста, что выглядит так, как будто она запускается синхронно, и не дает никаких реальных преимуществ.

Но если talk требует выполнения сетевого запроса или длинных, тяжелых вычислений, и animal_list были очень длинными, это может помочь с производительностью.

...