我正在嘗試以非阻塞方式執行異步無限回圈函式。目前我有以下代碼:
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() 會阻止執行并且“子行程已啟動”永遠不會被列印出來。請注意,我想在同步建構式中啟動后臺行程。我怎樣才能做到這一點?我還嘗試了一些使用多處理/執行緒的東西,但也失敗了。
uj5u.com熱心網友回復:
一旦您啟動事件回圈,例如使用loop_forever,它就會接管控制權。“永遠”是指直到沒有明確停止。回圈關閉后將到達以下列印訊息的陳述句,但隨后所有異步操作也將停止。
如果您需要將“后臺”服務作為任務運行,您還需要將“前臺”代碼轉換為異步任務,或者使用問題中提到的多執行緒或多處理,但不知道與預期通信的詳細資訊后臺任務很難提出任何建議。
uj5u.com熱心網友回復:
通過結合@norbeq here所述的多執行緒和異步任務解決了我的問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/436152.html
