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 所述,通过结合多线程和异步任务解决了我的问题。
我正在尝试以非阻塞方式执行异步无限循环函数。目前我有以下代码:
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