daniiyang
@daniiyang

Как реализовать асинхронную функцию с asyncio в моем случае?

Цель - создать документ не после закрытия программы, как это происходит сейчас, а во время ее работы.

Функция "first" просто должна вызывать асинхронную "second", которая создаст docx.

def first(self, event):
    loop = asyncio.get_event_loop()
    loop.run(self.second())

async def second(self):
    document = Document()
    document.save('test.docx')

Уверен, проблема в функции «first», в том, как она вызывает «second».

Я работаю над старым проектом, исправлять который нет времени; внутри много ошибок в базовых вещах, поэтому браузер не помог - нужно что-то конкретно под ситуацию. Даже не смотря на это, подскажите, пожалуйста, как решить проблему.
Спасибо.
  • Вопрос задан
  • 95 просмотров
Решения вопроса 1
marazm76
@marazm76
Почему конкретно не получается? Есть ошибки?
Вынесете запуск цикла из функции. Вот рабочий пример.
import asyncio


class Document:
    async def save(self, name):
        await asyncio.sleep(1)
        print(f'Document "{name}" has saved')


async def first():
    name = "test_document.doc"
    print("Run first function")
    await second(name)


async def second(name):
    await Document().save(name)


asyncio.run(first())


Из функции first можно асинхронно сохранять как один документ, так и несколько (через await asyncio.gather).
async def first():
    print("Run first function")
    await asyncio.gather(
        second('doc_1'),
        second('doc_2'),
        second('doc_3'),
    )


Из кода не понятна реализация класса Document, но я бы посоветовал сохранение тоже делать не блокирующим. Например можно использовать aiofile для асинхронного сохранения документов на диск.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы