• 队列Queue的get方法


    写了一段生产者消费者模型的代码:

     1 from time import sleep
     2 from random import randint, random
     3 from multiprocessing import Process, Queue
     4 
     5 
     6 def consumer(q, name):
     7     while 1:
     8         if q.get() == 'stop' and q.qsize() == 0:
     9             break
    10         food = q.get()
    11         print('%s 吃了 %s' % (name, food))
    12         sleep(randint(1, 3))
    13 
    14 
    15 def producer(q, name, food):
    16     for i in range(10):
    17         sleep(random())
    18         foo = food + str(i)
    19         print("%s 拉了一坨 %s" % (name, foo))
    20         q.put(foo)
    21 
    22 
    23 if __name__ == '__main__':
    24     q = Queue(10)
    25     c = Process(target=consumer, args=(q, "老狗"))
    26     c.start()
    27     p1 = Process(target=producer, args=(q, '峰哥', '粑粑'))
    28     p1.start()
    29     p1.join()
    30     q.put('stop')

    这段代码执行的结果是:

     1 峰哥 拉了一坨 粑粑0
     2 峰哥 拉了一坨 粑粑1
     3 老狗 吃了 粑粑1
     4 峰哥 拉了一坨 粑粑2
     5 峰哥 拉了一坨 粑粑3
     6 峰哥 拉了一坨 粑粑4
     7 老狗 吃了 粑粑3
     8 峰哥 拉了一坨 粑粑5
     9 老狗 吃了 粑粑5
    10 峰哥 拉了一坨 粑粑6
    11 峰哥 拉了一坨 粑粑7
    12 老狗 吃了 粑粑7
    13 峰哥 拉了一坨 粑粑8
    14 峰哥 拉了一坨 粑粑9
    15 老狗 吃了 粑粑9

    发现只打印了奇数的产品,排错发现是逻辑出错了,应该先用food先从队列里面get,然后去判断,而上面这段代码的问题出在每次if判断从队列里面拿出来了一个导致的

    下面是修改后的代码:

     1 from time import sleep
     2 from random import randint, random
     3 from multiprocessing import Process, Queue
     4 
     5 
     6 def consumer(q, name):
     7     while 1:
     8         food = q.get()
     9         if food == 'stop':
    10             break
    11         print('%s 吃了 %s' % (name, food))
    12         sleep(randint(1, 3))
    13 
    14 
    15 def producer(q, name, food):
    16     for i in range(10):
    17         sleep(random())
    18         foo = food + str(i)
    19         print("%s 拉了一坨 %s" % (name, foo))
    20         q.put(foo)
    21 
    22 
    23 if __name__ == '__main__':
    24     q = Queue(10)
    25     c = Process(target=consumer, args=(q, "老狗"))
    26     c.start()
    27     p1 = Process(target=producer, args=(q, '峰哥', '粑粑'))
    28     p1.start()
    29     p1.join()
    30     q.put('stop')
  • 相关阅读:
    PHP PSR 标准规范
    PHP线程安全与非线程安全的区别(NTS/TS)选择?
    goto 语法在 PHP 中的使用
    linux命令post请求发送json串
    接口日志表sql【我】
    sentinel最简单接入【我】
    Jps命令—使用详解
    MyBatis-Plus Wrapper条件构造器查询大全
    IDEA项目启动不起来也不打印日志【我】
    linux下查看nginx配置文件地址
  • 原文地址:https://www.cnblogs.com/linga/p/9400401.html
Copyright © 2020-2023  润新知