with與async with

應(yīng)用場(chǎng)景:

  • 文件的讀寫
  • 數(shù)據(jù)庫(kù)的讀寫操作
  • Flask的上下文管理

上下文管理協(xié)議:當(dāng)使用with語句時(shí)擒抛,解釋器會(huì)自動(dòng)調(diào)用 __enter__,__exit__

class Sample:
    def __enter__(self):
        print('enter')  #進(jìn)入資源
        return self
    def __exit__(self, exc_type, exc_val, exc_tb):
        print('exit')  #釋放資源
    def do_something(self):
        print('do something')

with Sample() as sample:   
    sample.do_something()

輸出

enter
do something
exit

進(jìn)入with語句,調(diào)用__enter__补疑;退出with語句歧沪,調(diào)用__exit__

事實(shí)上sample并不是sample=Sample(),而是__enter__返回的對(duì)象癣丧,即如果__enter__沒有return槽畔,sample將為None。

exc_type:異常類型胁编;exc_val:異常值厢钧;exc_tb:traceback。如果with語句中有異常發(fā)生嬉橙,__exit__中會(huì)收集這些異常信息早直。

async with

async with的用法和with一樣,只是內(nèi)部使用__aenter____aexit__來定義上下文市框。這樣我們就能在上下文中使用異步編程霞扬。

class Lock(object):
    def __init__(self, redis_client, key="", ttl=60, timeout=30, interval=0.03, is_wait=True):
        """
        :param key:
        :param ttl: expire time(鎖最大過期時(shí)間) / s
        :param timeout: timeout(阻塞最大時(shí)間) / s
        :param interval: sleep interval(睡眠間隔) / s
        :return:
        Usage::

            with Lock('my_lock') as lock:
                pass
        """
        self.redis_client = redis_client
        self.key = f"redis:lock:{key}"
        self.ttl = ttl
        self.timeout = timeout
        self.interval = interval
        self.value = uuid.uuid1().hex
        self.is_wait = is_wait

    async def __aenter__(self):
        res, wait_times = await self.async_acquire()
        return wait_times

    async def __aexit__(self, exc_type, exc, tb):
        self.release()

    async def async_acquire(self):
        timeout = self.timeout
        wait_times = 0  # 嘗試獲取鎖的次數(shù)
        if timeout == 0:
            while True:
                wait_times += 1
                # redis操作理論上也需要改為異步,由于redis操作很快枫振,暫時(shí)先用同步
                if self.redis_client.set(self.key, self.value, ex=self.ttl, nx=True):
                    return True, wait_times
                if not self.is_wait:  # 不等待鎖
                    raise TooFrequentException('Operation is too frequent')
                await asyncio.sleep(self.interval)
        else:
            while timeout >= 0:
                wait_times += 1
                if self.redis_client.set(self.key, self.value, ex=self.ttl, nx=True):
                    return True, wait_times
                timeout -= self.interval
                if not self.is_wait:  # 不等待鎖
                    raise TooFrequentException('Operation is too frequent')
                await asyncio.sleep(self.interval)
            raise LockTimeout("Timeout whilst waiting for lock")
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末喻圃,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子粪滤,更是在濱河造成了極大的恐慌斧拍,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,591評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件杖小,死亡現(xiàn)場(chǎng)離奇詭異肆汹,居然都是意外死亡愚墓,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人团搞,你說我怎么就攤上這事〈逑螅” “怎么了?”我有些...
    開封第一講書人閱讀 162,823評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵攒至,是天一觀的道長(zhǎng)煞肾。 經(jīng)常有香客問我,道長(zhǎng)嗓袱,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,204評(píng)論 1 292
  • 正文 為了忘掉前任习绢,我火速辦了婚禮渠抹,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘闪萄。我一直安慰自己梧却,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評(píng)論 6 388
  • 文/花漫 我一把揭開白布败去。 她就那樣靜靜地躺著放航,像睡著了一般。 火紅的嫁衣襯著肌膚如雪圆裕。 梳的紋絲不亂的頭發(fā)上广鳍,一...
    開封第一講書人閱讀 51,190評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音吓妆,去河邊找鬼赊时。 笑死,一個(gè)胖子當(dāng)著我的面吹牛行拢,可吹牛的內(nèi)容都是我干的祖秒。 我是一名探鬼主播,決...
    沈念sama閱讀 40,078評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼舟奠,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼竭缝!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起沼瘫,我...
    開封第一講書人閱讀 38,923評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤抬纸,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后晕鹊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體松却,經(jīng)...
    沈念sama閱讀 45,334評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡暴浦,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了晓锻。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片歌焦。...
    茶點(diǎn)故事閱讀 39,727評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖砚哆,靈堂內(nèi)的尸體忽然破棺而出独撇,到底是詐尸還是另有隱情,我是刑警寧澤躁锁,帶...
    沈念sama閱讀 35,428評(píng)論 5 343
  • 正文 年R本政府宣布纷铣,位于F島的核電站,受9級(jí)特大地震影響战转,放射性物質(zhì)發(fā)生泄漏搜立。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評(píng)論 3 326
  • 文/蒙蒙 一槐秧、第九天 我趴在偏房一處隱蔽的房頂上張望啄踊。 院中可真熱鬧,春花似錦刁标、人聲如沸颠通。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽顿锰。三九已至,卻和暖如春启搂,著一層夾襖步出監(jiān)牢的瞬間硼控,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工胳赌, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留淀歇,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,734評(píng)論 2 368
  • 正文 我出身青樓匈织,卻偏偏與公主長(zhǎng)得像浪默,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子缀匕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容