当前位置:天才代写 > tutorial > Python教程 > python多线程编程5: 条件变量同步

python多线程编程5: 条件变量同步

2017-11-02 08:00 星期四 所属: Python教程 浏览:50

互斥锁是最简朴的线程同步机制,Python提供的Condition工具提供了对巨大线程同步问题的支持。Condition被称为条件变量,除了提供与Lock雷同的acquire和release要领外,还提供了wait和notify要领。线程首先acquire一个条件变量,然后判定一些条件。假如条件不满意则wait;假如条件满意,举办一些处理惩罚改变条件后,通过notify要领通知其他线程,其他处于wait状态的线程接到通知后会从头判定条件。不绝的反复这一进程,从而办理巨大的同步问题。

可以认为Condition工具维护了一个锁(Lock/RLock)和一个waiting池。线程通过acquire得到Condition工具,当挪用wait要领时,线程会释放Condition内部的锁并进入blocked状态,同时在waiting池中记录这个线程。当挪用notify要领时,Condition工具会从waiting池中挑选一个线程,通知其挪用acquire要领实验取到锁。

Condition工具的结构函数可以接管一个Lock/RLock工具作为参数,假如没有指定,则Condition工具会在内部自行建设一个RLock。

除了notify要领外,Condition工具还提供了notifyAll要领,可以通知waiting池中的所有线程实验acquire内部锁。由于上述机制,处于waiting状态的线程只能通过notify要领叫醒,所以notifyAll的浸染在于防备有线程永远处于沉默沉静状态。

演示条件变量同步的经典问题是出产者与消费者问题:假设有一群出产者(Producer)和一群消费者(Consumer)通过一个市场来交互产物。出产者的”计策“是假如市场上剩余的产物少于1000个,那么就出产100个产物放到市场上;而消费者的”计策“是假如市场上剩余产物的数量多余100个,那么就消费3个产物。用Condition办理出产者与消费者问题的代码如下:

import threading
import time
 
class Producer(threading.Thread):
    def run(self):
        global count
        while True:
            if con.acquire():
                if count > 1000:
                    con.wait()
                else:
                    count = count+100
                    msg = self.name+' produce 100, count=' + str(count)
                    print msg
                    con.notify()
                con.release()
                time.sleep(1)
 
class Consumer(threading.Thread):
    def run(self):
        global count
        while True:
            if con.acquire():
                if count < 100:
                    con.wait()
                else:
                    count = count-3
                    msg = self.name+' consume 3, count='+str(count)
                    print msg
                    con.notify()
                con.release()
                time.sleep(1)
 
count = 500
con = threading.Condition()
 
def test():
    for i in range(2):
        p = Producer()
        p.start()
    for i in range(5):
        c = Consumer()
        c.start()
if __name__ == '__main__':
    test()

 

    关键字:


天才代写-代写联系方式