[英]Python Asyncio Task Cancel From Different Event Loop
我認為我遇到的問題與事件循環和從不同的事件循環調用取消有關。我認為導致問題的代碼是傳遞給連接到的客戶端庫的同步方法。外部源,當外部源失去連接時,它調用此方法。
問題是,stop和start方法都是異步的,並且在他們自己的工作中很好地在一個任務中創建了start方法,它等待睡眠結束然后調用stop來取消任務並且似乎工作正常,從同步方法我需要創建一個新的事件循環來調用stop也可以工作但是當你可以調用cancel時,任務似乎永遠不會關閉,只有在睡眠結束后才能獲得所需的重新連接結果。 如果我在它之前和之后打印self._task
變量會顯示它已被取消但它明顯繼續運行。
<Task pending coro=<AsyncAKSServer.start() running at aks_server.py:88> wait_for=<Future pending cb=[<TaskWakeupMethWrapper object at 0x7f551e268f18>()]> cb=[<TaskWakeupMethWrapper object at 0x7f551e268e58>()]>
<Task pending coro=<AsyncAKSServer.start() running at aks_server.py:88> wait_for=<Future cancelled> cb=[<TaskWakeupMethWrapper object at 0x7f551e268e58>()]>
不幸的是我無法提供IP原因的確切代碼,但下面是一個示例,顯示我正在嘗試做什么,我無法更新同步方法發送到當前的客戶端庫,因為我們在忙碌期間所以將其更改為異步不是一種選擇。 有一個真正的機會我誤解了文檔以及如何工作應該得到任何幫助。
import asyncio
class AsyncServer:
def __init__(self):
self._task = None
self._duration = 1
async def run(self):
while True:
self._task = asyncio.create_task(self.start())
try:
await self._task
except asyncio.CancelledError:
print('Start task cancelled')
async def start(self):
await asyncio.sleep(self._duration)
await self.stop()
async def stop(self):
self._taks.cancel()
def sync_request(self):
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
loop.run_until_complete(self.stop())
loop.stop()
loop.close()
def main():
server = AsyncServer()
asyncio.run(server.run())
這個問題確實是由必須創建一個新的事件循環引起的,對此的修復是在start方法中存儲對事件循環的引用。 然后,您可以使用它來調用asyncio.run_coroutine_threadsafe(self.stop(), self._loop)
,它會傳遞相同的循環並使取消按預期工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.