亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術文章
文章詳情頁

Python線程協作threading.Condition實現過程解析

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

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

import threading# 條件變量,用于復雜的線程間同步鎖'''需求: 男:小姐姐,你好呀! 女:哼,想泡老娘不成? 男:對呀,想泡你 女:滾蛋,門都沒有! 男:切,長這么丑, 還這么吊... 女:關你鳥事!'''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('{}:關你鳥事!'.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的底層實現了__enter__和 __exit__協議.所以可以使用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,結束 returnfor waiter in waiters_to_notify: # 循環release waiter.release() try: all_waiters.remove(waiter) #從_waiters中移除 except ValueError: pass

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 国产αv| 亚洲视频在线精品 | 日本乱人伦片中文三区 | 亚洲精品一区二区ai换脸 | 免费一级特黄欧美大片勹久久网 | 在线精品自拍亚洲第一区 | 成人免费高清视频网址 | 国产操比视频 | 国产亚洲精品成人久久网站 | 一级特黄aa大片免费 | 成人伊人青草久久综合网破解版 | 国产激情一区二区三区 | 黄色福利在线观看 | 多人性激烈的欧美三级视频 | 91短视频在线观看免费最新 | 91区国产 | 大陆国语自产精品视频在 | 日本大片久久久高清免费看 | 中国一级特黄真人毛片免费看 | 国产爱久久久精品 | 精品在线91 | 欧美福利片在线观看 | 成熟女性毛茸茸撒尿厕所 | 老鸭窝 国产 精品 91 | 国产免费福利体检区久久 | 日本在线不卡免费视频一区 | 另类在线| 日本免费高清一区 | 午夜成年人网站 | 免费黄色网页 | 一 级 黄 色蝶 片 | 国产麻豆精品在线观看 | 91av官网 | 香蕉人精品视频多人免费永久视频 | 99草在线观看 | 青青草97国产精品免费观看 | 九一精品视频 | 手机在线看黄 | 国产亚洲精品自在久久77 | 一级毛片免费播放视频 | 黑人狂躁日本妞 |