一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術(shù)及教程分享平臺(tái)!
分類導(dǎo)航

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

服務(wù)器之家 - 腳本之家 - Python - Python多線程編程(七):使用Condition實(shí)現(xiàn)復(fù)雜同步

Python多線程編程(七):使用Condition實(shí)現(xiàn)復(fù)雜同步

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

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

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

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

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

下面我們通過很著名的“生產(chǎn)者-消費(fèi)者”模型來來演示下,在Python中使用Condition實(shí)現(xiàn)復(fù)雜同步。

復(fù)制代碼 代碼如下:

'''
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()

 

代碼中主要實(shí)現(xiàn)了生產(chǎn)者和消費(fèi)者線程,雙方將會(huì)圍繞products來產(chǎn)生同步問題,首先是2個(gè)生成者生產(chǎn)products ,而接下來的10個(gè)消費(fèi)者將會(huì)消耗products,代碼運(yùn)行如下:

 

復(fù)制代碼 代碼如下:

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對(duì)象的構(gòu)造函數(shù)可以接受一個(gè)Lock/RLock對(duì)象作為參數(shù),如果沒有指定,則Condition對(duì)象會(huì)在內(nèi)部自行創(chuàng)建一個(gè)RLock;除了notify方法外,Condition對(duì)象還提供了notifyAll方法,可以通知waiting池中的所有線程嘗試acquire內(nèi)部鎖。由于上述機(jī)制,處于waiting狀態(tài)的線程只能通過notify方法喚醒,所以notifyAll的作用在于防止有線程永遠(yuǎn)處于沉默狀態(tài)。

 

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 成年人天堂 | 人人澡人 | 夫妇交换小说全文阅读 | 久久re热在线视频精99 | 久久青草费线频观看国产 | 免费看60分钟大片视频播放 | 亚洲精品一线二线三线 | 国产精品一二区 | 办公室出轨秘书高h | 9420高清完整版在线观看国语 | jux629三浦理惠子在线播放 | 俄罗斯三级完整版在线观看 | 高跟丝袜麻麻求我调教 | 91视频免费观看网站 | 日韩手机在线观看 | 亚洲精品国产一区二区在线 | 日本老妇成熟 | 极品美女aⅴ高清在线观看 极品ts赵恩静和直男激战啪啪 | 青草园网站在线观看 | 久久久久999 | 国产精品一久久香蕉产线看 | 无码乱人伦一区二区亚洲 | 亚洲午夜精品久久久久久成年 | 欧美黑人换爱交换乱理伦片 | 呜呜别塞了啊抽插 | 双性受合不垅腿攻np | 美国雪白人妖sarina | 日韩在线观看网址 | 久久午夜夜伦痒痒想咳嗽P 久久无码AV亚洲精品色午夜麻豆 | 亚洲精品青青草原avav久久qv | 无删减影视免费观看 | 成年女人毛片免费观看97 | 30分钟的高清视频在线观看 | 视频一区二区三区欧美日韩 | 暖暖视频日本 | 白丝校花被扒开双腿喷水小说 | 娇小异类videos | 肉文高h文 | 国产一区二区在线看 | 娇妻被朋友征服中文字幕 | 国语自产自拍秒拍在线视频 |