Actor and it’s Manager

There are a Actor Base class for async tasks in this package.

How to use

We can use ActorManager to manage the Actor’s Subclasses. And Use the Subclasses itself to manage it’s instacnes.

import asyncio
try:
    from aio_parallel_tools import AioActor, ActorManager
except ModuleNotFoundError as e:
    import sys
    from pathlib import Path
    p = Path(__file__).absolute()
    root = p.parent.parent.parent.absolute()
    sys.path.append(str(root))
    from aio_parallel_tools import AioActor, ActorManager


class Pinger(AioActor):
    async def receive(self, message):
        print(message)
        try:
            await ActorManager.get_actor("Ponger").Send('ping')
        except Exception as e:
            print(f"receive run error {e}")
        finally:
            await asyncio.sleep(0.5)


class Ponger(AioActor):
    async def receive(self, message):
        print(message)
        try:
            await ActorManager.get_actor("Pinger").Send('pong')
        except Exception as e:
            print(f"receive run error {e}")
        finally:
            await asyncio.sleep(0.5)


async def main():
    actors = ActorManager.has_actor()
    for actor_name in actors:
        A = ActorManager.get_actor(actor_name)
        A.Start(num=3)
    await asyncio.sleep(1)
    for i in ActorManager.get_actor("Pinger").Members:
        print("****************")
        print(i.aid)
        print(i.available)
        print(i.running)
        print(i.paused)
        print("****************")

    await ActorManager.get_actor("Pinger").Send("start")
    await asyncio.sleep(10)

    for actor_name in actors:
        A = ActorManager.get_actor(actor_name)
        await A.Close(num=3)


if __name__ == "__main__":
    loop = asyncio.get_event_loop()
    try:
        loop.run_until_complete(main())
    finally:
        # 不管是什么异常,最终都要close掉loop循环
        loop.close()