国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - Python多線程編程(七):使用Condition實現復雜同步

Python多線程編程(七):使用Condition實現復雜同步

2020-05-30 23:32腳本之家 Python

這篇文章主要介紹了Python多線程編程(七):使用Condition實現復雜同步,本文講解通過很著名的“生產者-消費者”模型來來演示在Python中使用Condition實現復雜同步,需要的朋友可以參考下

目前我們已經會使用Lock去對公共資源進行互斥訪問了,也探討了同一線程可以使用RLock去重入鎖,但是盡管如此我們只不過才處理了一些程序中簡單的同步現象,我們甚至還不能很合理的去解決使用Lock鎖帶來的死鎖問題。所以我們得學會使用更深層的解決同步問題。

Python提供的Condition對象提供了對復雜線程同步問題的支持。Condition被稱為條件變量,除了提供與Lock類似的acquire和release方法外,還提供了wait和notify方法。

使用Condition的主要方式為:線程首先acquire一個條件變量,然后判斷一些條件。如果條件不滿足則wait;如果條件滿足,進行一些處理改變條件后,通過notify方法通知其他線程,其他處于wait狀態的線程接到通知后會重新判斷條件。不斷的重復這一過程,從而解決復雜的同步問題。

下面我們通過很著名的“生產者-消費者”模型來來演示下,在Python中使用Condition實現復雜同步。

復制代碼 代碼如下:

'''
Created on 2012-9-8
 
@author: walfred
@module: thread.TreadTest7
''' 
 
import threading 
import time 
 
condition = threading.Condition() 
products = 0 
 
class Producer(threading.Thread): 
    def __init__(self): 
        threading.Thread.__init__(self) 
 
    def run(self): 
        global condition, products 
        while True: 
            if condition.acquire(): 
                if products < 10: 
                    products += 1; 
                    print "Producer(%s):deliver one, now products:%s" %(self.name, products) 
                    condition.notify() 
                else: 
                    print "Producer(%s):already 10, stop deliver, now products:%s" %(self.name, products) 
                    condition.wait(); 
                condition.release() 
                time.sleep(2) 
 
class Consumer(threading.Thread): 
    def __init__(self): 
        threading.Thread.__init__(self) 
 
    def run(self): 
        global condition, products 
        while True: 
            if condition.acquire(): 
                if products > 1: 
                    products -= 1 
                    print "Consumer(%s):consume one, now products:%s" %(self.name, products) 
                    condition.notify() 
                else: 
                    print "Consumer(%s):only 1, stop consume, products:%s" %(self.name, products) 
                    condition.wait(); 
                condition.release() 
                time.sleep(2) 
 
if __name__ == "__main__": 
    for p in range(0, 2): 
        p = Producer() 
        p.start() 
 
    for c in range(0, 10): 
        c = Consumer() 
        c.start()

 

代碼中主要實現了生產者和消費者線程,雙方將會圍繞products來產生同步問題,首先是2個生成者生產products ,而接下來的10個消費者將會消耗products,代碼運行如下:

 

復制代碼 代碼如下:

Producer(Thread-1):deliver one, now products:1
Producer(Thread-2):deliver one, now products:2
Consumer(Thread-3):consume one, now products:1
Consumer(Thread-4):only 1, stop consume, products:1
Consumer(Thread-5):only 1, stop consume, products:1
Consumer(Thread-6):only 1, stop consume, products:1
Consumer(Thread-7):only 1, stop consume, products:1
Consumer(Thread-8):only 1, stop consume, products:1
Consumer(Thread-10):only 1, stop consume, products:1
Consumer(Thread-9):only 1, stop consume, products:1
Consumer(Thread-12):only 1, stop consume, products:1
Consumer(Thread-11):only 1, stop consume, products:1


另外:Condition對象的構造函數可以接受一個Lock/RLock對象作為參數,如果沒有指定,則Condition對象會在內部自行創建一個RLock;除了notify方法外,Condition對象還提供了notifyAll方法,可以通知waiting池中的所有線程嘗試acquire內部鎖。由于上述機制,處于waiting狀態的線程只能通過notify方法喚醒,所以notifyAll的作用在于防止有線程永遠處于沉默狀態。

 

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 久久综合久久久 | 日韩视频精品在线观看 | 99热在线播放 | 精品国产91 | 精品伦精品一区二区三区视频 | 国产毛片黄色片 | 久久伊人官网 | 国产在线精品一区二区三区 | 色婷婷中文字幕 | 欧美综合一区 | 亚洲一区视频在线 | аⅴ资源新版在线天堂 | 台湾av片| 国产一区二区日韩 | www.日韩系列 | 亚洲 欧美 日韩 在线 | 久久午夜精品 | 久草福利在线视频 | 国产精品亚洲综合 | 亚洲精品视频在线 | 亚洲成人高清 | 久久久久久网站 | 中文在线а√在线8 | 久久久久久久一区 | 久久久久久成人 | 人人爱夜夜爽日日视频 | 亚洲激情av | 国产中文字幕一区 | 日本三级韩国三级三级a级中文 | 一区二区三区高清不卡 | 综合网视频| 亚洲男人天堂2018 | 国产v日产∨综合v精品视频 | 夜夜操比 | 日韩高清av | 国产成人精品一区二区三区四区 | 狠狠色狠色综合曰曰 | 国产精品一区二 | 欧美一区二区最爽乱淫视频免费看 | 亚洲 欧美 国产 制服 动漫 | 日韩精品免费在线视频 |