• Python多线程Thread——生产者消费者模型


    1. import random
    2. import threading
    3. import time
    4. # Lock = threading.Lock() # 创建一个线程锁。Lock.acquire()表示锁住,线程进入阻塞(暂停)。Lock.release()表示释放(线程继续)
    5. books = 10 # 图书馆书籍数量
    6. b_rt = 0 # 外面持有数量(借出去的数量)
    7. day = 0 # 计算天数
    8. # 图书馆向外租借书
    9. def rent_book():
    10. global b_rt, books
    11. Lock = threading.Lock() # 建锁
    12. locked = False # 判断是否锁住,初始未加锁
    13. while True:
    14. time.sleep(1)
    15. check = True if books > 0 else False # 判断是否有书
    16. if not check: # 没书
    17. print('图书馆没有书了')
    18. if not locked: # 没书还未加锁的话,加锁
    19. Lock.acquire()
    20. locked = True
    21. continue # 没有书跳过本次循环(不管有没有加锁)
    22. if check and locked: # 加锁肯定没书。所以如果有书且加锁了,可以解锁
    23. Lock.release()
    24. locked = False
    25. n = random.randint(1, books) if books > 1 else 1
    26. n = books if books < n else n
    27. books -= n
    28. b_rt += n
    29. print(f"借出去了{n}本,还剩{books},外面{b_rt}")
    30. # 外面持有书籍归还图书馆
    31. def return_book():
    32. global b_rt, books
    33. Lock = threading.Lock()
    34. locked = False
    35. while True:
    36. time.sleep(2)
    37. check = True if b_rt > 0 else False
    38. if not check:
    39. if not locked:
    40. Lock.acquire()
    41. locked = True
    42. continue
    43. if check and locked:
    44. Lock.release()
    45. locked = False
    46. m = random.randint(1, b_rt) if b_rt > 1 else 1
    47. books += m
    48. b_rt -= m
    49. print(f"归还{m}本,还剩{books},外面{b_rt}")
    50. # 图书馆隔段时间会补充一本
    51. def buyabook():
    52. global books, day
    53. day += 1
    54. print(f"这是第{day}天:\t图书馆有书{books}本\t", end="")
    55. books += 1
    56. print("进书1本")
    57. t = threading.Timer(10, buyabook)
    58. # Timer对象第一个参数是step间隔,第二个是方法(在方法内可以是方法本身)
    59. t.start() # 表示调用一次函数会单独启用一个线程
    60. t1 = threading.Thread(target=rent_book, args=()) # 创建借书线程
    61. t2 = threading.Thread(target=return_book, args=()) # 创建还书线程
    62. # threading.Thread(target=func, args=()) 中target是方法,args是方法的元组形式的参数,
    63. buyabook() # Timer任务会独立启用一个线程
    64. t1.start()
    65. t2.start()

    下面面向对象的角度看线程

    1. import threading
    2. import time
    3. # 创建一个线程类
    4. class Eat(threading.Thread):
    5. def __init__(self, name, s: int):
    6. # 类继承要注意super函数,这里的target可以不写,默认是run。目的是线程启动调用的是run方法
    7. super(Eat, self).__init__(target=self.run)
    8. self.name = name
    9. self.s = s # 定义一个时间间隔
    10. self.flag = False # 定义一个标记(线程结束标记)
    11. def run(self): # 构建主函数。线程启动后运行的是此方法
    12. while True:
    13. time.sleep(self.s)
    14. print(f"{self.name}在吃饭")
    15. if self.flag: # 标记为True结束线程
    16. break
    17. def stop(self): # 定义个方法设置标记为True
    18. self.flag = True
    19. print("线程终止")
    20. if __name__ == '__main__':
    21. aron = Eat("aron", 2)
    22. aron.start() # 线程启动后会持续运行
    23. # 再实例一个线程
    24. lily = Eat("lily", 1)
    25. lily.start()
    26. # 所有线程都运行再一个进程上,他们单独运行互不影响。除非他们调用了进程上的公共属性
    27. # 比如你可以把时间设置为进程上的一个变量,例如:
    28. # step = 2
    29. # aron = Eat("aron", step)
    30. # lily = Eat("lily", step)
    31. print("线程启动后会独立于主线程") # 线程启动后会独立于主线程。下面的内容是独立于被启动的两个线程的
    32. time.sleep(5)
    33. aron.stop()
    34. lily.stop()

    那么你可以试试看能不能用面向对象的方法实现生产者消费者模型吧。

    python队列与多线程——生产者消费者模型

  • 相关阅读:
    Eclipse创建Maven Project跟Maven Module
    web server apache tomcat11-04-manager 如何管理?
    OpenGL 图像色调
    特斯拉2年内实现全自动驾驶,无人驾驶时代还远吗?丨曼孚科技
    k8s--基础--01--介绍
    mac13 intellij系列全家桶全屏键入闪烁问题
    Hadoop伪分布模式安装
    6、PostgreSQL 数据类型之一:数字类型和货币类型
    pytest自动化测试-element not interactable、xpath元素定位不到、多页签下子表定位、pip使用问题
    Java 工具库Hutool
  • 原文地址:https://blog.csdn.net/weixin_71370467/article/details/132734227