2017-08-07 129 views
-1

我有一個類方法coroutine類,並從一個用戶同時獲得多個請求,假設用戶在t = 0進行函數調用,並且函數需要10毫秒的過程,用戶在t = 3毫秒時進行另一次異步調用,然後在t = 10毫秒時響應請求1,並且在t = 20ms時響應請求2,所以請求2的轉換時間爲17毫秒,但是我想要下面的場景,如何確保只有單個進程在線程中運行

如果請求1來自t = 0ms的一個用戶,並且在請求2進入t = 3ms之前運行3ms,那麼調用1必須被銷燬並呼叫響應2必須啓動,並且對於請求2的響應必須在t = 13ms時返回,轉向時間爲10ms。

就像確保每個用戶進行單個進程一樣。 所以,如果有一個函數

def Myfunction(a,b): 
    return a+b 

    #user calls 
    #at t = 0 
    myfunction(10,5) #takes 10 ms 

    #at t=3 
    myfunction(100,200)#takes 10 ms 

    so i want that myfunction must have only single/latest call instance running for each user i.e in above case only myfunction(100,200) my be occupying the the CPU after t=3 . 

我使用python ASYNCIO從語句和事件循環庫和產量。

請提供一些想法如何實現上述想法。

+0

只是可以肯定,等待用戶響應啓動一個線程,那麼你要銷燬線程,如果用戶調用同樣的事情再次啓動它一遍? –

+0

是的,我想摧毀那個線程,如果用戶再次調用相同的東西來清空新的調用CPU –

+0

你知道你的代碼不會創建一個新的線程嗎? –

回答

0

在asyncio中,您將使用任務來處理此問題。您跟蹤當前正在運行的功能,並取消它,當它再次被調用

_running = None 
async def wrapped_myfunction(): 
    global _running 
    if _running is not None: 
     _running.cancel() 
    _running = asyncio.create_task(myfunction()) 
    return await _running 
相關問題