2017-04-07 86 views
1

海峽的一點是:蟒蛇異步專用類方法__delete__

我怎樣才能async def特價類的方法,如在python __delete__

爲什麼我需要這樣的:

爲了實現多進程之間共享一個不錯的緩存系統,我想從數據庫中檢索一次數據,並將它們存儲在緩存,緩存中的修改數據和當數據不再使用時:更新數據庫。我的問題是,爲了知道哪些情況下是最後一個,我想用__delete__特殊方法asyncly

def asyncinit(cls): 
    """Credits: http://stackoverflow.com/a/33140788/4241798""" 
    __new__ = cls.__new__ 

    async def init(obj, *arg, **kwarg): 
     await obj.__init__(*arg, **kwarg) 
     return obj 

    def new(cls, *arg, **kwarg): 
     obj = __new__(cls, *arg, **kwarg) 
     coro = init(obj, *arg, **kwarg) 
     return coro 

    cls.__new__ = new 
    return cls 

@asyncinit 
class AsyncUser: 
    async def __init__(self, id: int): 
     self.id = id 
     with await cachepool as cache: 
      cache.hincr(f"users:{id}", "refcnt") 

    async def __delete__(self): 
     """Won't work""" 
     with await cachepool as cache: 
      refcnt = await cache.hincrby(f"users:{self.id}", "refcnt", -1) 
      if refcnt == 0: 
       # update database 

    # rest of the class... 
+0

Duplicate:請參閱本文以獲得答案。 http://stackoverflow.com/a/33134213/1943571 –

+0

我來自那裏,這個答案不適用於'__delete__'這個方法' –

+0

它說在那裏的異步不適用於非異步魔術方法,*包括*'__delete__'。 –

回答

1

這是不可能的異步高清python的builint方法,但有可能以外安排協同程序調用使用loop.create_futureasyncio.ensure_future的迴路

class asyncdel: 
    def __delete__(self): 
     asyncio.ensure_future(free(self.__dict__.copy())) 

async def free(data): 
    pass