Могу ли я использовать async / await для ускорения инициализации классов? - PullRequest
1 голос
/ 21 апреля 2020

Я python стартер и пытаюсь написать несколько программ для анализа данных. программа похожа на приведенную ниже:

import asyncio
import time


class Test:
    def __init__(self, task):
        self.task = task
        time.sleep(5)  # here's some other jobs...
        print(f'{self.task = }')


async def main():
    result = []
    tasks = ['task1', 'task2', 'task3', 'task4', 'task5', 'task6', 'task7', 'task8', 'task9']
    print(f"started at {time.strftime('%X')}")

    # I have a program structure like this, can I use async?
    # how to start init tasks at almost the same time?
    for task in tasks:
        result.append(Test(task))
    print(f"finished at {time.strftime('%X')}")


asyncio.run(main())

Я пробовал другой способ, например многопроцессорность, он работает, код выглядит так:

...
def main():
    result = []
    tasks = ['task1', 'task2', 'task3', 'task4', 'task5', 'task6', 'task7', 'task8', 'task9']
    print(f"started at {time.strftime('%X')}")

    # I have a program structure like this, can I use async?
    # how to start init tasks at the same time?
    p = Pool()
    result = p.map(operation, [(task,) for task in tasks])
    print(f"finished at {time.strftime('%X')}")
...

, но я все еще хочу выучить некоторые современные способ сделать это. Я нашел модуль с именем 'ray', он новый.
Но может ли asyn c сделать это? Мне все еще интересно ... Если кто-то может дать мне совет, большое спасибо.

1 Ответ

0 голосов
/ 22 апреля 2020

Ваш пример кода не обязательно выиграет от asyn c IO, потому что __init__ не "ожидаемо". Возможно, вы сможете воспользоваться asyn c, если ваш код структурирован по-другому и имеет соответствующее узкое место. Например, если бы у нас было:

class Task:
    def __init__(self):
        <some not io bound stuff>
        <some io bound task>

Мы могли бы реструктурировать это так:

    class Task:
    def __init__(self):
        <some not io bound stuff>

    async def prime(self):
        await <some io bound task>

Тогда в вашем основном l oop вы можете инициализировать задачи так, как вы затем выполните медленный шаг prime в вашем событии l oop.

Однако мой совет здесь состоит в том, чтобы не делать этого, если вы не знаете, что у вас определенно есть проблема. Сопрограммы могут быть довольно неудобными, поэтому вы должны делать это только в том случае, если вам это нужно!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...