簡體   English   中英

從不同的事件循環取消Python Asyncio任務

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM