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

这篇具有很好参考价值的文章主要介绍了Python多线程Thread——生产者消费者模型 python队列与多线程——生产者消费者模型。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

import random
import threading
import time

# Lock = threading.Lock()  # 创建一个线程锁。Lock.acquire()表示锁住,线程进入阻塞(暂停)。Lock.release()表示释放(线程继续)

books = 10  # 图书馆书籍数量
b_rt = 0  # 外面持有数量(借出去的数量)
day = 0  # 计算天数


# 图书馆向外租借书
def rent_book():
    global b_rt, books
    Lock = threading.Lock()  # 建锁
    locked = False  # 判断是否锁住,初始未加锁
    while True:
        time.sleep(1)
        check = True if books > 0 else False  # 判断是否有书
        if not check:  # 没书
            print('图书馆没有书了')
            if not locked:  # 没书还未加锁的话,加锁
                Lock.acquire()
                locked = True
            continue  # 没有书跳过本次循环(不管有没有加锁)
        if check and locked:  # 加锁肯定没书。所以如果有书且加锁了,可以解锁
            Lock.release()
            locked = False
        n = random.randint(1, books) if books > 1 else 1
        n = books if books < n else n
        books -= n
        b_rt += n
        print(f"借出去了{n}本,还剩{books},外面{b_rt}")


# 外面持有书籍归还图书馆
def return_book():
    global b_rt, books
    Lock = threading.Lock()
    locked = False
    while True:
        time.sleep(2)
        check = True if b_rt > 0 else False
        if not check:
            if not locked:
                Lock.acquire()
                locked = True
            continue
        if check and locked:
            Lock.release()
            locked = False
        m = random.randint(1, b_rt) if b_rt > 1 else 1
        books += m
        b_rt -= m
        print(f"归还{m}本,还剩{books},外面{b_rt}")


# 图书馆隔段时间会补充一本
def buyabook():
    global books, day
    day += 1
    print(f"这是第{day}天:\t图书馆有书{books}本\t", end="")
    books += 1
    print("进书1本")
    t = threading.Timer(10, buyabook)
    # Timer对象第一个参数是step间隔,第二个是方法(在方法内可以是方法本身)
    t.start()  # 表示调用一次函数会单独启用一个线程


t1 = threading.Thread(target=rent_book, args=())  # 创建借书线程
t2 = threading.Thread(target=return_book, args=())  # 创建还书线程
# threading.Thread(target=func, args=()) 中target是方法,args是方法的元组形式的参数,
buyabook()  # Timer任务会独立启用一个线程
t1.start()
t2.start()

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

import threading
import time


# 创建一个线程类
class Eat(threading.Thread):
    def __init__(self, name, s: int):
        # 类继承要注意super函数,这里的target可以不写,默认是run。目的是线程启动调用的是run方法
        super(Eat, self).__init__(target=self.run)
        self.name = name
        self.s = s  # 定义一个时间间隔
        self.flag = False  # 定义一个标记(线程结束标记)

    def run(self):  # 构建主函数。线程启动后运行的是此方法
        while True:
            time.sleep(self.s)
            print(f"{self.name}在吃饭")
            if self.flag:  # 标记为True结束线程
                break

    def stop(self):  # 定义个方法设置标记为True
        self.flag = True
        print("线程终止")


if __name__ == '__main__':
    aron = Eat("aron", 2)
    aron.start()  # 线程启动后会持续运行
    # 再实例一个线程
    lily = Eat("lily", 1)
    lily.start()
    # 所有线程都运行再一个进程上,他们单独运行互不影响。除非他们调用了进程上的公共属性
    # 比如你可以把时间设置为进程上的一个变量,例如:
    # step = 2
    # aron = Eat("aron", step)
    # lily = Eat("lily", step)
    print("线程启动后会独立于主线程")  # 线程启动后会独立于主线程。下面的内容是独立于被启动的两个线程的
    time.sleep(5)
    aron.stop()
    lily.stop()

那么你可以试试看能不能用面向对象的方法实现生产者消费者模型吧。文章来源地址https://www.toymoban.com/news/detail-702410.html

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

到了这里,关于Python多线程Thread——生产者消费者模型 python队列与多线程——生产者消费者模型的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 线程同步--生产者消费者模型--单例模式线程池

    条件变量是 线程间共享的全局变量 ,线程间可以通过条件变量进行同步控制 条件变量的使用必须依赖于互斥锁以确保线程安全,线程申请了互斥锁后,可以调用特定函数 进入条件变量等待队列(同时释放互斥锁) ,其他线程则可以通过条件变量在特定的条件下唤醒该线程( 唤醒后线

    2024年01月20日
    浏览(33)
  • C#多线程学习(三) 生产者和消费者

    线程学习第一篇: C#多线程学习(一) 多线程的相关概念 线程学习第二篇: C#多线程学习(二) 如何操纵一个线程 前面说过,每个线程都有自己的资源,但是代码区是共享的,即每个线程都可以执行相同的函数。这可能带来的问题就是几个线程同时执行一个函数,导致数据的混

    2023年04月21日
    浏览(32)
  • 线程池-手写线程池C++11版本(生产者-消费者模型)

    本项目是基于C++11的线程池。使用了许多C++的新特性,包含不限于模板函数泛型编程、std::future、std::packaged_task、std::bind、std::forward完美转发、std::make_shared智能指针、decltype类型推断、std::unique_lock锁等C++11新特性功能。 本项目有一定的上手难度。推荐参考系列文章 C++11实用技

    2024年02月13日
    浏览(30)
  • JavaEE 初阶篇-生产者与消费者模型(线程通信)

    🔥博客主页: 【 小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍   文章目录         1.0 生产者与消费者模型概述         2.0 在生产者与消费者模型中涉及的关键概念         2.1 缓冲区         2.2 生产者         2.3 消费者         2.4 同步机制         2.5 线程间通

    2024年04月28日
    浏览(31)
  • 多线程(初阶七:阻塞队列和生产者消费者模型)

    目录 一、阻塞队列的简单介绍 二、生产者消费者模型 1、举个栗子: 2、引入生产者消费者模型的意义: (1)解耦合 (2)削峰填谷 三、模拟实现阻塞队列 1、阻塞队列的简单介绍 2、实现阻塞队列 (1)实现普通队列 (2)加上线程安全 (3)加上阻塞功能 3、运用阻塞队列

    2024年02月05日
    浏览(31)
  • 探究:kafka生产者/消费者与多线程安全

    目录 1. 多线程安全 1.1. 生产者是多线程安全的么? 1.1. 消费者是多线程安全的么? 2. 消费者规避多线程安全方案 2.1. 每个线程维护一个kafkaConsumer 2.2. [单/多]kafkaConsumer实例 + 多worker线程 2.3.方案优缺点对比         Kafka生产者是 线程安全 的,可以在多个线程中共享一个

    2023年04月26日
    浏览(75)
  • 【linux】线程同步+基于BlockingQueue的生产者消费者模型

    喜欢的点赞,收藏,关注一下把! 在线程互斥写了一份抢票的代码,我们发现虽然加锁解决了抢到负数票的问题,但是一直都是一个线程在抢票,它错了吗,它没错但是不合理。那我们应该如何安全合理的抢票呢? 讲个小故事。 假设学校有一个VIP学霸自习室,这个自习室有

    2024年02月03日
    浏览(88)
  • C# 快速写入日志 不卡线程 生产者 消费者模式

    有这样一种场景需求,就是某个方法,对耗时要求很高,但是又要记录日志到数据库便于分析,由于访问数据库基本都要几十毫秒,可在方法里写入BlockingCollection,由另外的线程写入数据库。 可以看到,在我的机子上面,1ms写入了43条日志。

    2024年02月15日
    浏览(38)
  • 线程池-手写线程池Linux C简单版本(生产者-消费者模型)

    本线程池采用C语言实现 线程池的场景: 当某些任务特别耗时(例如大量的IO读写操作),严重影响线程其他的任务的执行,可以使用线程池 线程池的一般特点: 线程池通常是一个生产者-消费者模型 生产者线程用于发布任务,任务通常保存在任务队列中 线程池作为消费者,

    2024年02月14日
    浏览(32)
  • 多线程学习之生产者和消费者与阻塞队列的关系

    生产者消费者问题,实际上主要是包含了两类线程: 生产者线程用于生产数据 消费者线程用于消费数据 生产者和消费者之间通常会采用一个共享的数据区域,这样就可以将生产者和消费者进行解耦, 两者都不需要互相关注对方的 Object类的等待和唤醒方法 方法名 说明 void

    2024年02月11日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包