• 多线程编程中的条件变量及其优化


    本套课在线学习视频(网盘地址,保存到网盘即可免费观看):

    链接:https://pan.quark.cn/s/7220b198cf00

    多线程编程中,条件变量是一种用于线程间通信和同步的机制。通过使用条件变量,可以有效地协调线程间的关系,优化资源利用,并减少线程在CPU资源上的不必要占用。本文将通过Python示例代码,详细介绍如何在多线程环境中使用条件变量。

    00:00 - 多线程编程中的条件变量及其优化

    使用条件变量优化线程间的协调与资源利用

    条件变量允许线程在某个条件不满足时进入等待状态,并在条件满足时被唤醒。这样可以避免线程空闲时对CPU资源的占用,并提高程序性能。

    1. import threading
    2. import time
    3. # 共享资源
    4. shared_data = []
    5. lock = threading.Lock()
    6. condition = threading.Condition(lock)
    7. class Producer(threading.Thread):
    8. def __init__(self, name):
    9. super().__init__()
    10. self.name = name
    11. def run(self):
    12. global shared_data
    13. while True:
    14. with condition:
    15. shared_data.append(f"Data from {self.name}")
    16. print(f"{self.name} produced data")
    17. condition.notify_all() # 通知所有等待的消费者
    18. time.sleep(1)
    19. class Consumer(threading.Thread):
    20. def __init__(self, name):
    21. super().__init__()
    22. self.name = name
    23. def run(self):
    24. global shared_data
    25. while True:
    26. with condition:
    27. while not shared_data:
    28. print(f"{self.name} is waiting")
    29. condition.wait() # 等待生产者通知
    30. data = shared_data.pop(0)
    31. print(f"{self.name} consumed {data}")
    32. time.sleep(1)
    33. # 创建生产者和消费者线程
    34. producers = [Producer(f"Producer-{i}") for i in range(2)]
    35. consumers = [Consumer(f"Consumer-{i}") for i in range(3)]
    36. # 启动线程
    37. for producer in producers:
    38. producer.start()
    39. for consumer in consumers:
    40. consumer.start()
    41. # 等待线程结束(这里实际上是无限循环,所以不会结束)
    42. for producer in producers:
    43. producer.join()
    44. for consumer in consumers:
    45. consumer.join()

    02:02 - 条件变量实现生产者-消费者模型

    通过引入条件变量,优化了生产者-消费者模型,使得程序在资源不足时能够进入等待状态,并在资源可用时被唤醒继续执行。这种优化方式提高了程序的性能,特别是在资源闲置状态下能够及时释放锁,避免了不必要的阻塞。

    1. import threading
    2. import time
    3. import random
    4. # 共享资源
    5. buffer = []
    6. buffer_size = 5
    7. lock = threading.Lock()
    8. condition = threading.Condition(lock)
    9. class Producer(threading.Thread):
    10. def __init__(self, name):
    11. super().__init__()
    12. self.name = name
    13. def run(self):
    14. global buffer
    15. while True:
    16. with condition:
    17. while len(buffer) >= buffer_size:
    18. print(f"{self.name} is waiting due to full buffer")
    19. condition.wait() # 等待消费者消费
    20. item = f"Item from {self.name}"
    21. buffer.append(item)
    22. print(f"{self.name} produced {item}")
    23. condition.notify_all() # 通知所有等待的消费者
    24. time.sleep(random.random())
    25. class Consumer(threading.Thread):
    26. def __init__(self, name):
    27. super().__init__()
    28. self.name = name
    29. def run(self):
    30. global buffer
    31. while True:
    32. with condition:
    33. while not buffer:
    34. print(f"{self.name} is waiting due to empty buffer")
    35. condition.wait() # 等待生产者生产
    36. item = buffer.pop(0)
    37. print(f"{self.name} consumed {item}")
    38. condition.notify_all() # 通知所有等待的生产者
    39. time.sleep(random.random())
    40. # 创建生产者和消费者线程
    41. producers = [Producer(f"Producer-{i}") for i in range(2)]
    42. consumers = [Consumer(f"Consumer-{i}") for i in range(3)]
    43. # 启动线程
    44. for producer in producers:
    45. producer.start()
    46. for consumer in consumers:
    47. consumer.start()
    48. # 等待线程结束(这里实际上是无限循环,所以不会结束)
    49. for producer in producers:
    50. producer.join()
    51. for consumer in consumers:
    52. consumer.join()

    通过这些示例代码,您可以更好地理解如何在Python中使用条件变量来优化多线程编程,特别是在生产者-消费者模型中,条件变量能够显著提高程序的性能和资源利用率。

  • 相关阅读:
    优盘不认,无法识别的情况下,如何修复问题
    使用js实现安居客二级菜单及(注意事项和问题点演示)完整版
    Java学习笔记4.3.2 数学计算 - Random类
    2.3 Go语言中的字符型和常量定义
    全局 id生成对比
    SpringBoot笔记之模板引擎
    nodejs毕业设计源码中介房屋租赁管理系统
    5.无霍尔BLDC转子预定位及同步加速
    Java技能树-网络-UDP-DatagramSocket
    大规模语言模型高效参数微调--BitFit/Prefix/Prompt 微调系列
  • 原文地址:https://blog.csdn.net/weixin_41489908/article/details/140400144