久久r热视频,国产午夜精品一区二区三区视频,亚洲精品自拍偷拍,欧美日韩精品二区

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

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

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

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

import threading# 條件變量,用于復(fù)雜的線程間同步鎖'''需求: 男:小姐姐,你好呀! 女:哼,想泡老娘不成? 男:對(duì)呀,想泡你 女:滾蛋,門都沒(méi)有! 男:切,長(zhǎng)這么丑, 還這么吊... 女:關(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('{}:對(duì)呀,想泡你'.format(self.name)) self.condition.wait() self.condition.notify() print('{}:切,長(zhǎng)這么丑, 還這么吊...'.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('{}:滾蛋,門都沒(méi)有!'.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的底層實(shí)現(xiàn)了__enter__和 __exit__協(xié)議.所以可以使用with上下文管理器

由Condition的__init__方法可知,它的底層也是維護(hù)了一個(gè)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是如何操作的,還是有點(diǎn)懵.....

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

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

notify()方法源碼

all_waiters = self._waiters waiters_to_notify = _deque(_islice(all_waiters, n))# 從_waiters中取出n個(gè)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, 放到一個(gè)deque中,然后釋放掉with鎖, notify時(shí),從deque取拿出鎖,release

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

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 如东县| 紫云| 屯留县| 夏邑县| 静乐县| 鹤壁市| 富顺县| 封丘县| 绥中县| 冀州市| 延安市| 沁阳市| 工布江达县| 分宜县| 行唐县| 沾化县| 思茅市| 逊克县| 乐业县| 阿克| 海阳市| 东乡县| 东乌珠穆沁旗| 丰都县| 曲水县| 遵化市| 古浪县| 广平县| 德惠市| 句容市| 诸城市| 海安县| 嘉义市| 互助| 封丘县| 南汇区| 通海县| 高州市| 武穴市| 黄冈市| 铜川市|