av一区二区在线观看_亚洲男人的天堂网站_日韩亚洲视频_在线成人免费_欧美日韩精品免费观看视频_久草视

您的位置:首頁技術(shù)文章
文章詳情頁

Python線程協(xié)作threading.Condition實現(xiàn)過程解析

瀏覽:4日期:2022-08-02 15:11:36

領(lǐng)會下面這個示例吧,其實跟java中wait/nofity是一樣一樣的道理

import threading# 條件變量,用于復(fù)雜的線程間同步鎖'''需求: 男:小姐姐,你好呀! 女:哼,想泡老娘不成? 男:對呀,想泡你 女:滾蛋,門都沒有! 男:切,長這么丑, 還這么吊... 女:關(guān)你鳥事!'''class Boy(threading.Thread): def __init__(self, name, condition): super().__init__(name=name) self.condition = condition def run(self): with self.condition: print('{}:小姐姐,你好呀!'.format(self.name)) self.condition.wait() self.condition.notify() print('{}:對呀,想泡你'.format(self.name)) self.condition.wait() self.condition.notify() print('{}:切,長這么丑, 還這么吊...'.format(self.name)) self.condition.wait() self.condition.notify()class Girl(threading.Thread): def __init__(self, name, condition): super().__init__(name=name) self.condition = condition def run(self): with self.condition: print('{}:哼,想泡老娘不成?'.format(self.name)) self.condition.notify() self.condition.wait() print('{}:滾蛋,門都沒有!'.format(self.name)) self.condition.notify() self.condition.wait() print('{}:關(guān)你鳥事!'.format(self.name)) self.condition.notify() self.condition.wait()if __name__ == ’__main__’: condition = threading.Condition() boy_thread = Boy(’男’, condition) girl_thread = Girl(’女’, condition) boy_thread.start() girl_thread.start()

Condition的底層實現(xiàn)了__enter__和 __exit__協(xié)議.所以可以使用with上下文管理器

由Condition的__init__方法可知,它的底層也是維護了一個RLock鎖

def __enter__(self): return self._lock.__enter__()

def __exit__(self, *args): return self._lock.__exit__(*args)

def __exit__(self, t, v, tb): self.release()

def release(self): '''Release a lock, decrementing the recursion level. If after the decrement it is zero, reset the lock to unlocked (not owned by any thread), and if any other threads are blocked waiting for the lock to become unlocked, allow exactly one of them to proceed. If after the decrement the recursion level is still nonzero, the lock remains locked and owned by the calling thread. Only call this method when the calling thread owns the lock. A RuntimeError is raised if this method is called when the lock is unlocked. There is no return value. ''' if self._owner != get_ident(): raise RuntimeError('cannot release un-acquired lock') self._count = count = self._count - 1 if not count: self._owner = None self._block.release()

至于wait/notify是如何操作的,還是有點懵.....

wait()方法源碼中這樣三行代碼

waiter = _allocate_lock() #從底層獲取了一把鎖,并非Lock鎖waiter.acquire()self._waiters.append(waiter) # 然后將這個鎖加入到_waiters(deque)中saved_state = self._release_save() # 這是釋放__enter__時的那把鎖???

notify()方法源碼

all_waiters = self._waiters waiters_to_notify = _deque(_islice(all_waiters, n))# 從_waiters中取出n個if not waiters_to_notify: # 如果是None,結(jié)束 returnfor waiter in waiters_to_notify: # 循環(huán)release waiter.release() try: all_waiters.remove(waiter) #從_waiters中移除 except ValueError: pass

大體意思: wait先從底層創(chuàng)建鎖,acquire, 放到一個deque中,然后釋放掉with鎖, notify時,從deque取拿出鎖,release

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 夜夜久久| 国产精品1区2区3区 一区中文字幕 | 日韩精品一区二区不卡 | 国产精品99久久久久久宅男 | 小草久久久久久久久爱六 | 国产一区电影 | 69热视频在线观看 | 一区二区三区中文字幕 | 视频1区 | 久久久精| 97超碰站| 一级特黄色毛片 | 日韩av大片免费看 | 91视频在线| 成人国产精品免费观看 | 中文字幕在线网 | 日本三级精品 | 亚洲第一av | 免费性视频 | 国产91久久精品一区二区 | 精品国产青草久久久久96 | 成人av影院 | 久久综合久久久 | 男人天堂国产 | jlzzjlzz欧美大全 | 国产精品久久久久久 | 欧美日韩视频一区二区 | 欧美激情精品久久久久久 | 亚洲欧洲成人av每日更新 | 精品伦精品一区二区三区视频 | 中文字幕在线精品 | 91高清在线观看 | 精品一区二区三区四区五区 | 成人性视频在线播放 | 日本黄色激情视频 | 久久久爽爽爽美女图片 | 99reav | 欧美精品a∨在线观看不卡 欧美日韩中文字幕在线播放 | 羞羞网站免费观看 | av手机在线免费观看 | 久久精品网 |