Aleksey GroupWork 10543
Dimitry GroupWork 10648
f1import asynciof1import asyncio
22
3class Loop:3class Loop:
n4    funcs = []n4    _funcs = []
5    wrappers = []5    _steps = []
6    ready = None6    _evt = None
7    started = False7    _launched = False
8    stop = False8    _halt = False
9    total = 09    _count = 0
1010
n11    def __call__(self, func):n11    def __call__(self, fn):
12        Loop.funcs.append(func)12        Loop._funcs.append(fn)
13        Loop.total = len(Loop.funcs)13        Loop._count = len(Loop._funcs)
1414
n15        async def wrapper(*args, **kwargs):n15        async def outer(*a, **kw):
16            if Loop.ready is None:16            if Loop._evt is None:
17                Loop.ready = asyncio.Event()17                Loop._evt = asyncio.Event()
1818
n19            async def step():n19            async def runner():
20                while True:20                while True:
n21                    if Loop.stop:n21                    if Loop._halt:
22                        return None22                        return None
n23                    r = await func(*args, **kwargs)n23                    out = await fn(*a, **kw)
24                    if r is None:24                    if out is None:
25                        Loop.stop = True25                        Loop._halt = True
26                        return None26                        return None
n27                    return rn27                    return out
28            Loop.wrappers.append(step)28            Loop._steps.append(runner)
29            if len(Loop.wrappers) == Loop.total:29            if len(Loop._steps) == Loop._count:
30                Loop.ready.set()30                Loop._evt.set()
31            await Loop.ready.wait()31            await Loop._evt.wait()
32            if not Loop.started:32            if not Loop._launched:
33                Loop.started = True33                Loop._launched = True
34                await Loop._run()34                await Loop._cycle()
35            return None35            return None
n36        return wrappern36        return outer
3737
38    @staticmethod38    @staticmethod
n39    async def _run():n39    async def _cycle():
40        steps = Loop.wrappers40        seq = Loop._steps
41        while True:41        while True:
t42            for s in steps:t42            for r in seq:
43                r = await s()43                val = await r()
44                if r is None:44                if val is None:
45                    return45                    return
Legends
Colors
 Added 
Changed
Deleted
Links
(f)irst change
(n)ext change
(t)op