鱼C论坛

 找回密码
 立即注册
查看: 2997|回复: 0

[技术交流] 多线程:经典的生产者和消费者问题

[复制链接]
发表于 2020-9-25 09:28:33 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
# 队列queue用来存储数据,先进来的先出去(FIFO)当队列满了之后就不在存了,.get提取数据,.put获得数据
# 后面会接触到存储数据的栈,后进来的先出去(LIFO),就像‘先穿袜子再穿鞋,而先脱鞋后脱袜子’的关系
  1. from threading import Thread, current_thread
  2. import time
  3. import random
  4. from queue import Queue

  5. que = Queue(5)  # 储存5个数据的队列


  6. class ProducerThread(Thread):
  7.     def run(self):
  8.         name = current_thread().getName()
  9.         nums = range(100)
  10.         global que
  11.         while True:  # 死循环用来测试
  12.             num = random.choice(nums)  # 获得0-99中的一个随机数
  13.             que.put(num)  # 队列获得这个随机数
  14.             print('生产者%s生产了数据%s' % (name, num))
  15.             t = random.randint(1, 3)
  16.             time.sleep(t)
  17.             print('生产者%s--睡眠了%s秒' % (name, t))


  18. class ConsumerThread(Thread):
  19.     def run(self):
  20.         name = current_thread().getName()
  21.         global que
  22.         while True:
  23.             num = que.get()
  24.             que.task_done()
  25.             print('消费者%s消耗了数据%s' % (name, num))
  26.             t = random.randint(1, 5)
  27.             time.sleep(t)
  28.             print('消费者%s--睡眠了%s秒' % (name, num))


  29. p1 = ProducerThread(name='p1')
  30. p1.start()  # 开始运行,不然程序无执行
  31. c1 = ConsumerThread(name='c1')
  32. c1.start()
  33. c2 = ConsumerThread(name='c2')
  34. c2.start()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-27 15:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表