Выполнение асинхронных функций

Есть асинхронная функция time_is которая каждую секунду обновляется, и требуется постоянно забирать значение с этой функции и обрабатывать ее в параллельной асинхронной функции printer (Задача поставлена с работой именно двух функций, как упрощенный вариант другой задачи). Суть приблизительно такова:

async def time_is():
    a = 0
    while True:
        await asyncio.sleep(1)
        a += 1

async def printer():
    await print(a)

Пытался решить поставленную задачу - так (и другими способами), но к сожалению не вышло:

import asyncio
import time

@printer
async def time_is():
    a = 0
    while True:
        await asyncio.sleep(1)
        a += 1

async def printer(func):
    async def inner():
        func()
        await print(a)

async def main():
    task1 = asyncio.create_task(time_is)
    task2 = asyncio.create_task(printer)

    await task1
    await task2

asyncio.run(main())

Задача сводится к тому, что так как переменная внутри асинхронной def time_is с бесконечным циклом тривиально с помощью return не выводится за пределы функции, требуется так написать/обернуть def printer, чтобы он собирал значения функции из def time_is (если это возможно), или сделать так, чтобы переменная 'a' из time_is все таки выводилась за пределы функции, причем в режиме реального времени (с течением time.sleep). Функция async def printer - лишь пример функции обработки данной переменной извлекаемой из непрекращающейся функции async def

Для объяснения проблемы, по задумке, можно было бы каждые 0 секунд отлавливать значения из time_is, и совать в printer. Если решать через огромный костыль, то можно написать и запустить два кода time_is.py и printer.py и использовать open('text.txt') сначала на запись (в time_is), а потом на чтение (в printer), но очевидно почему это решение не оптимально, но надеюсь подобный пример даст более точное описание данного вопроса


Ответы (1 шт):

Автор решения: SerjK

Самый простой вариант это использовать глобальную переменную. Если нужен обмен между процессами, то использовать из multiprocessing.sharedctypes класс Value.

import asyncio

a = 0


async def time_is():
    global a
    while True:
        await asyncio.sleep(1)
        a += 1


async def printer():
    while True:
        await asyncio.sleep(1)
        print(a)


async def main():
    task1 = asyncio.create_task(time_is())
    task2 = asyncio.create_task(printer())

    await task2


asyncio.run(main())
→ Ссылка