zoukankan      html  css  js  c++  java
  • 多线程之生产者和消费者模式

    思路:

    需要定义一个全局变量,供生产者和消费者使用

    1、对于生产者来说:x>0 wait(print) ,否则x+1(使用for循环)

    2、对于消费者来说:x==0 wait(print),否则x-1(使用for循环)

    3、生产者和消费者分别是一个class

     1 __author__ = 'anna'
     2 # coding: utf-8
     3 
     4 import threading
     5 x = 0  # 定义变量x
     6 
     7 
     8 class Producer(threading.Thread):
     9 
    10     def __init__(self, name):
    11         threading.Thread.__init__(self)
    12         self.name = name
    13 
    14     def run(self):
    15         # global语句可以声明一个或多个变量为全局变量,该声明仅仅在当前代码块中有效,除此之外,没有办法访问全局变量
    16         global x
    17         threadLock.acquire()
    18         if x > 0:
    19             print("我已经有东西了,再等等呗!")
    20         else:
    21             for i in range(6):
    22                 x += 1
    23                 print("%s正在生产,第%d个" % (self.name, x))
    24         threadLock.release()
    25 
    26 
    27 class Consumer(threading.Thread):
    28 
    29     def __init__(self, name):
    30         threading.Thread.__init__(self)
    31         self.name = name
    32 
    33     def run(self):
    34         global x
    35         threadLock.acquire()
    36         if x == 0:
    37             print("我没有东西了,我需要生产!")
    38         else:
    39             for i in range(5):
    40                 x -= 1
    41                 print("%s正在消费,第%d个" % (self.name, x))
    42         threadLock.release()
    43 
    44 threadLock = threading.Lock()
    45 p1 = Producer('我的生产者线程')
    46 p1.start()
    47 p1.join()  # 需要加上join方法,因为只有先生产才能消费,加上join方法不会导致错乱
    48 
    49 c1 = Consumer('我的消费者线程')
    50 c1.start()
    51 c1.join()
  • 相关阅读:
    NTP时间服务器
    SVN搭建以及客户端使用
    Rsync+Sersync实时同步数据目录
    Docker容器入门篇
    Perl环境安装
    Mysqldump备份问题
    Jumpserver1.4.1安装
    this指向
    polyfill之javascript函数的兼容写法——Array篇
    JavaScriptPolyfillShim 在JavaScript中Shim和Polyfill有什么区别?
  • 原文地址:https://www.cnblogs.com/annatest/p/13357107.html
Copyright © 2011-2022 走看看