一个 发送 接收 执行 反馈的例子

import asyncio
from threading import Thread, Event


class wk:

    def __init__(self):
        self.th: Thread
        self.loop = asyncio.new_event_loop()

    def _cancel_all(self):
        if tks := asyncio.all_tasks(self.loop):
            for task in tks:
                task.cancel()
            self.loop.run_until_complete(asyncio.gather(*tks, return_exceptions=True))

    def _doing(self):
        asyncio.set_event_loop(self.loop)
        try:
            self.loop.run_forever()
        finally:
            self._cancel_all()
            self.loop.run_until_complete(self.loop.shutdown_asyncgens())
            self.loop.close()

    def __enter__(self):
        (th := Thread(target=self._doing, daemon=True)).start()
        self.th = th
        return self

    def __exit__(self, a, b, c):
        self.loop.call_soon_threadsafe(self.loop.stop)
        self.th.join()
        del self.th

    def arun(self, coro):
        ev = Event()

        async def wrapper():
            await coro
            ev.set()

        self.loop.call_soon_threadsafe(self.loop.create_task, wrapper())
        return ev


if __name__ == "__main__":

    async def demo_task(i):
        print(f"Task {i} enter")
        await asyncio.sleep(0.1 * i)
        print(f"Task {i} done ")

    with wk() as w:
        for i in range(15):
            w.arun(demo_task(i))
        ev = w.arun(demo_task(15))
        ev.wait()



posted @ 2025-03-26 17:33  方头狮  阅读(3)  评论(0)    收藏  举报