python 在后台触发并忘记异步函数

python fire and forget async function in background

我正在尝试以非阻塞方式执行异步无限循环函数。目前我有以下代码:

class OpcuaClient():
    def __init__(self):
        ...
        #subscribe to changes
        loop = asyncio.get_event_loop()
        loop.create_task(self.subscribe_to_node(self.type_Nid))
        loop.create_task(self.subscribe_to_node(self.housingSerial_Nid))
        loop.run_forever()
 
        print("subprocesses started")
 
    async def subscribe_to_node(self, nodeid):
        async with Client(url=self.url) as client:
            node = client.get_node(nodeid)
            # subscribing to node
            sub = await client.create_subscription(500, self.handler)
            await sub.subscribe_data_change(node)
            # subscribe for infinte time
            while True:
                await asyncio.sleep(1)

然而 loop.run_forever() 阻止了执行并且“子进程已启动”永远不会被打印出来。请注意,我想在同步构造函数中启动后台进程。我怎样才能做到这一点?我也用 Multiprocessing/threading 尝试了一些东西,但也失败了。

一旦你开始事件循环,例如使用 loop_forever,它接管了控制权。 “永远”意味着直到没有明确停止。循环关闭后将到达以下打印消息的语句,但随后所有异步也会停止。

如果您需要运行“后台”服务作为任务,您也需要将“前台”代码转换为异步任务,或者使用您在问题中提到的多线程或多处理,但是在不知道与后台任务预期通信的详细信息的情况下,很难提出任何建议。

如@norbeq 所述,通过结合多线程和异步任务解决了我的问题。