python3实现生产者消费者模型

  • 生产者消费者模型
    一个模型,可以用来搭建消息队列。
    主要用于解决·两个线程之间速度不匹配问题,在两个线程之间建立一个缓存空间。
    用一个队列来充当缓存空间,如果生产者生产过快就让生产者线程等一等,若消费者消费过快同理。
  • 一个实例
    定义一个生产者线程,每隔1秒向队列中放入5个产品,当队列中产品数量超过100时就停止生产开始等待。
    定义一个消费者线程,每隔1秒从队列中消费20个产品,当队列中产品数量少于50就停止消费开始等待。
    在主线程中,先向队列中放入两百个初始线程,然后启动两个生产者线程,一个消费者线程。
import threading;
import time;
import queue;
queue = queue.Queue();
count = 0;
#生产者线程 当队列中产品数量小于100时就每隔1秒向队列放5个产品
class producer(threading.Thread):
    def run(self):
        global queue;
        global count;

        while True:
            if queue.qsize() < 100:
                list = [];
                for i in range(5):
                    count = count + 1;

                    queue.put(count);
                    list.append(count);
                print("生产者生产了5个产品:{0}".format(list));
            else:
                print('生产者线程等待中。。。');

            time.sleep(1);
#消费者线程 当队列中产品数量大于50时就每隔1秒从队列中消费20个产品
class consumer(threading.Thread):
    def run(self):
        global queue;

        while True:
            if queue.qsize() > 50:
                list = [];
                for i in range(20):
                    msg = queue.get();
                    list.append(msg);
                print("消费者消费了:{0}".format(list));
            else:
                print('消费者线程{0}等待中。。。'.format(self.name));
            time.sleep(1);

#先在消息队列中放入200个初始产品
print("主线程放入初始产品:");
for i in range(1,201):
    count = count + 1;
    queue.put(i);
    print(i,end=' ');
    if(i%25==0):
        print('\n');

#启动生产者线程
p1 = producer();
p1.start();
p2 = producer();
p2.start();

#启动消费者线程
c1 = consumer();
c1.start();


#在主线程中,每隔1秒打印队列中产品剩余情况
while True:
    print('\n----------------队列中还有{0}个产品-----------\n'.format(queue.qsize()));
    time.sleep(1);
  • 运行实例代码观察会发生什么。。

主线程放入初始产品:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 

26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 

51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 

76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 

101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 

126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 

151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 

176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 

生产者线程等待中。。。
生产者线程等待中。。。
消费者消费了:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]

----------------队列中还有180个产品-----------


----------------队列中还有180个产品-----------
生产者线程等待中。。。生产者线程等待中。。。


消费者消费了:[21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40]

----------------队列中还有160个产品-----------

生产者线程等待中。。。
生产者线程等待中。。。
消费者消费了:[41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60]

----------------队列中还有140个产品-----------

生产者线程等待中。。。
生产者线程等待中。。。
消费者消费了:[61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80]

----------------队列中还有120个产品-----------

生产者线程等待中。。。生产者线程等待中。。。

消费者消费了:[81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100]

----------------队列中还有100个产品-----------

生产者线程等待中。。。生产者线程等待中。。。

消费者消费了:[101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120]

----------------队列中还有80个产品-----------

生产者生产了5个产品:[201, 202, 203, 204, 205]
生产者生产了5个产品:[206, 207, 208, 209, 210]
消费者消费了:[121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140]

----------------队列中还有70个产品-----------

生产者生产了5个产品:[211, 212, 213, 214, 215]
消费者消费了:[141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160]
生产者生产了5个产品:[216, 217, 218, 219, 220]

----------------队列中还有60个产品-----------

生产者生产了5个产品:[221, 222, 223, 224, 225]
消费者消费了:[161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180]
生产者生产了5个产品:[226, 227, 228, 229, 230]

----------------队列中还有50个产品-----------

生产者生产了5个产品:[231, 232, 233, 234, 235]
消费者消费了:[181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200]
生产者生产了5个产品:[236, 237, 238, 239, 240]

----------------队列中还有40个产品-----------

生产者生产了5个产品:[241, 242, 243, 244, 245]
消费者线程Thread-3等待中。。。
生产者生产了5个产品:[246, 247, 248, 249, 250]

----------------队列中还有50个产品-----------

生产者生产了5个产品:[251, 252, 253, 254, 255]
消费者消费了:[201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220]
生产者生产了5个产品:[256, 257, 258, 259, 260]

----------------队列中还有40个产品-----------

生产者生产了5个产品:[261, 262, 263, 264, 265]
消费者线程Thread-3等待中。。。
生产者生产了5个产品:[266, 267, 268, 269, 270]

----------------队列中还有50个产品-----------

生产者生产了5个产品:[271, 272, 273, 274, 275]
消费者消费了:[221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240]
生产者生产了5个产品:[276, 277, 278, 279, 280]

----------------队列中还有40个产品-----------

生产者生产了5个产品:[281, 282, 283, 284, 285]
消费者线程Thread-3等待中。。。
生产者生产了5个产品:[286, 287, 288, 289, 290]
Process finished with exit code -1

可以看出,由于初始队列中有200个产品,此时生产者线程等待,只有消费者线程工作,每过一秒队列中产品都会减少20个。
然后,等减少到少于100个时,生产者线程与消费者线程同时工作,此时每过一秒队列中产品减少10个。
最后等队列中产品数量减少到50时,生产者与消费者会达到一种动态平衡,
生产者一直工作,消费者每隔一秒等待一次,这样单位时间生产数量与消费数量刚好持平。

  • 由于多线程程序的运行结果是不可预估的,当更改程序中部分数据时会出现更多运行情况。

你可能感兴趣的:(PYTHON)