日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python的线程/进程间通讯对象分析

發布時間:2025/3/20 python 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python的线程/进程间通讯对象分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2019獨角獸企業重金招聘Python工程師標準>>>

Python提供了一系列的對象支持線程/進程間的通訊:

  • Lock
  • RLock
  • Condition
  • Semaphone
  • BounderSemaphone
  • Event
  • Barrier
  • 除了Lock,Rlock外,進程的相關對象只是線程相關對象的clone,而且進程的Lock,RLock也是與線程Lock,RLock相對應的對象。在這里我們只分析線程的這幾種對象。
    一般使用范圍:

    Lock用于對互斥操作(單一資源,全局變量)
    RLock與Lock類似,區別僅在與RLock在同一個線程可以多次獲取
    Semaphone/BounderSemaphone用于對多個資源的申請使用, 如果BounderSemaphone(1)則==Lock()
    Condition用于在等待某種事情發生
    Event實際上是對Condition的一種操作簡化包裝,也更符合事件驅動的概念。
    這幾種對象大概使用上面這些對象所要付出的開銷是不同的,我們從其原理來進行分析。

    from time import sleep
    from threading import Thread, Lock

    class MyThread(Thread):def __init__(self, name, lock):super(MyThread, self).__init__(name=name)self.lock = lockdef run(self):with self.lock:print('my name is %s, i will sleep 2 seconds' % self.name)sleep(2)print('i wake up now.')if __name__ == '__main__':lock = Lock()mt1 = MyThread('t1', lock)mt2 = MyThread('t2', lock)mt1.start(); mt2.start()mt1.join(); mt2.join()print('main thread end!')

    Lock的使用方法參考上面的代碼,而RLock是跟Lock的區別是如果在本線程已經acquire,則可以多次acquire,不同線程下則跟Lock是一致的;我們來看一下RLock的實現:

    class _RLock:def __init__(self):self._block = _allocate_lock()self._owner = Noneself._count = 0def acquire(self, blocking=True, timeout=-1):me = get_ident() # 獲取當前thread的identityif self._owner == me: # 鎖的所有者是自己self._count += 1return 1rc = self._block.acquire(blocking, timeout) #獲取鎖if rc:self._owner = meself._count = 1return rc

    從上面的代碼可以看出,RLock實際上是使用了Lock,只是在acquire時判斷了是否是本線程,如果是,則記錄lock次數不做阻塞返回。

    而Condition在調用wait時則新生成了一個Lock,并acquire了兩次已達到阻塞的目的,而。

    class Condition:def __init__(self, lock=None):.....self._waiters = _deque() # 初始化waiter Lock 隊列def wait(self, timeout=None):if not self._is_owned(): # 必須要先獲取鎖raise RuntimeError("cannot wait on un-acquired lock")waiter = _allocate_lock()waiter.acquire()self._waiters.append(waiter) #將waiter Lock加入waiter隊列.....waiter.acquire()def _is_owned(self):# Return True if lock is owned by current_thread.# This method is called only if _lock doesn't have _is_owned().if self._lock.acquire(0):self._lock.release() # 在wait,notify時會釋放互斥鎖return Falseelse:return Truedef notify(self, n=1):if not self._is_owned(): # 必須要先獲取鎖raise RuntimeError("cannot notify on un-acquired lock")all_waiters = self._waiterswaiters_to_notify = _deque(_islice(all_waiters, n))if not waiters_to_notify:returnfor waiter in waiters_to_notify:waiter.release() #根據通知數量依次釋放

    Lock只是一個單純的互斥體,而Condition則可在某種條件發生后主動通知正在等待某種條件的線程。

    from threading import Thread, Lock, Conditionclass MyWaitThread(Thread):def __init__(self, name, cond):super(MyWaitThread, self).__init__(name=name)# self.name = nameself.cond = conddef run(self):with self.cond:print('I am waiting something happen!')self.cond.wait()print('wait end!')class MyNotifyThread(Thread):def __init__(self, name, cond):super(MyNotifyThread, self).__init__(name=name)# self.name = nameself.cond = conddef run(self):with self.cond:print('I am notifying all the wait thread.')self.cond.notify_all()print('notify end.')if __name__ == '__main__':cond = Condition()mt1 = MyWaitThread('t1', cond)mt2 = MyWaitThread('t2', cond)mt3 = MyNotifyThread('t3', cond)mt1.start(); mt2.start(); mt3.start()mt1.join(); mt2.join();mt3.join()print('main thread end!')

    Semaphone使用Condition的wait,notify來實現,但是卻可以看成一個可以在不同線程中同時獲取N次的鎖。

    轉載于:https://my.oschina.net/caoxinyu0205/blog/741819

    總結

    以上是生活随笔為你收集整理的Python的线程/进程间通讯对象分析的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。