练习生产者与消费者-PYTHON多线程中的条件变量同步

以前练习过,但好久不用,手生,概念也生了,

重温一下。。

URL:

http://www.cnblogs.com/holbrook/tag/%E5%A4%9A%E7%BA%BF%E7%A8%8B/

~~~~~~~

互斥锁是最简单的线程同步机制,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的作用在于防止有线程永远处于沉默状态。

~~~~~~~~~~~~~~

# coding=utf8
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 += 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 -= 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()
    print ‘end‘

# coding=utf8
import threading
import time
from Queue import Queue

class Producer(threading.Thread):
    def run(self):
        global queue
        count = 0
        while True:
            for i in range(1000):
                if queue.qsize() > 1000:
                    pass
                else:
                    count += 1
                    msg = u‘生成产品‘ + str(count)
                    queue.put(msg)
                    print msg
            time.sleep(1)

class Consumer(threading.Thread):
    def run(self):
        global queue
        while True:
            for i in range(3):
                if queue.qsize() < 100:
                    pass
                else:
                    msg = self.name + u‘消费了‘ + queue.get()
                    queue.put(msg)
                    print msg
            time.sleep(1)

queue = Queue()

def test():
    for i in range(500):
        queue.put(u‘初始产品‘+str(i))
    for i in range(2):
        p = Producer()
        p.start()
    for i in range(5):
        c = Consumer()
        c.start()

if __name__ == ‘__main__‘:
    test()
    print ‘end‘

  

时间: 2024-10-10 05:18:28

练习生产者与消费者-PYTHON多线程中的条件变量同步的相关文章

python多线程编程(4): 条件变量同步

互斥锁是最简单的线程同步机制,Python提供的Condition对象提供了对复杂线程同步问题的支持.Condition被称为条件变量,除了提供与Lock类似的acquire和release方法外,还提供了wait和notify方法.线程首先acquire一个条件变量,然后判断一些条件.如果条件不满足则wait:如果条件满足,进行一些处理改变条件后,通过notify方法通知其他线程,其他处于wait状态的线程接到通知后会重新判断条件.不断的重复这一过程,从而解决复杂的同步问题. 可以认为Cond

python多线程编程5: 条件变量同步-乾颐堂

互斥锁是最简单的线程同步机制,Python提供的Condition对象提供了对复杂线程同步问题的支持.Condition被称为条件变量,除了提供与Lock类似的acquire和release方法外,还提供了wait和notify方法.线程首先acquire一个条件变量,然后判断一些条件.如果条件不满足则wait:如果条件满足,进行一些处理改变条件后,通过notify方法通知其他线程,其他处于wait状态的线程接到通知后会重新判断条件.不断的重复这一过程,从而解决复杂的同步问题. 可以认为Cond

在SQL存储过程中给条件变量加上单引号

在SQL存储过程中给条件变量加上单引号,不加语句就会出问题,以下就是在存储过程中将条件where设置成了动态变化的,给where赋完值再和前面的语句拼接,再execute(SQL) set @where= '(DATEDIFF(day,'''+CONVERT(varchar(100), @d_start, 23)+''',sdate)>=0 and DATEDIFF(day,'''+CONVERT(varchar(100), @d_end, 23)+''',sdate)<=0) and ' +

java-Runnable加锁实现生产者和消费者的多线程问题

案例: 有一家商品售卖机构,只有一名生产者,两名消费者,请采用多线程的方式对这个案例进行实现. //库存函数,保存着库存的信息Storage.java public class Storage { //模拟库存 public Integer num=1; } //生产者函数 product.java /************************************************************    Copyright (C), 1988-1999, Huawei T

Boost lockfree deque 生产者与消费者多对多线程应用

boost库中有一个boost::lockfree::queue类型的 队列,对于一般的需要队列的程序,其效率都算不错的了,下面使用一个用例来说明. 程序是一个典型的生产者与消费者的关系,都可以使用多线程,其效率要比使用上层的互斥锁要快很多,因为它直接使用底层的原子操作来进行同步数据的. freedeque.h 1 #pragma once#ifndef INCLUDED_UTILS_LFRINGQUEUE 2 #define INCLUDED_UTILS_LFRINGQUEUE 3 4 #de

彻底理解Python多线程中的setDaemon与join【配有GIF示意】

在进行Python多线程编程时, join() 和 setDaemon() 是最常用的方法,下面说说两者的用法和区别. 1.join () 例子:主线程A中,创建了子线程B,并且在主线程A中调用了B.join(), 那么,主线程A会在调用的地方阻塞,直到子线程B完成操作后,才可以接着往下执行. 2.setDaemon() 例子:主线程A中,创建了子线程B,并且在主线程A中调用了B.setDaemon(), 即:把主线程A设置为守护线程,这时候,要是主线程A执行结束了,就不管子线程B是否完成,一并

Python多线程(2)——线程同步机制

本文介绍Python中的线程同步对象,主要涉及 thread 和 threading 模块. threading 模块提供的线程同步原语包括:Lock.RLock.Condition.Event.Semaphore等对象. 1. Lock 1.1 Lock对象的创建 Lock是Python中最底层的同步机制,直接由底层模块 thread 实现,每个lock对象只有两种状态——上锁和未上锁,不同于下文的RLock对象,Lock对象是不可重入的,也没有所属的线程这个概念. 可以通过下面两种方式创建一

python 程序中设置环境变量

python 中调用系统命令有三种方法: 1.os.system('command') ,这个方法是直接调用标准C的system() 函数,仅仅在一个子终端运行系统命令,而不能获取命令执行后的返回信息. 2.os.popen('command'),该方法不但执行命令还返回执行后的信息对象,是通过一个管道文件将结果返回,例如可以设置一个变量,返回结果. 1 cha = os.popen('ls /').readlines 3.模块subprocess,实际使用过程中发现,假设要在代码当前进程中设置

python threading之条件变量同步

有一类线程需要满足条件之后才能够继续执行,Python提供了threading.Condition 对象用于条件变量线程的支持,它除了能提供RLock()或Lock()的方法外,还提供了 wait().notify().notifyAll()方法.wait([timeout]):线程挂起,直到收到一个notify通知或者超时(可选的,浮点数,单位是秒s)才会被唤醒继续运行.wait()必须在已获得Lock前提下才能调用,否则会触发RuntimeError.调用wait()会释放Lock,直至该线