返回顶部
首页 > 资讯 > 后端开发 > Python >关于生产消费者模型中task_done()的具体作用
  • 836
分享到

关于生产消费者模型中task_done()的具体作用

生产消费者模型task_done()的作用生产消费者 2023-02-25 11:02:14 836人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录直奔主题代码解释对比解释看效果注释掉q.task_done()和q.join()仅注释掉q.task_done()**总结最后直奔主题 tase_done()的作用: 只有消费者

直奔主题

tase_done()的作用:

只有消费者把队列所有的数据处理完毕,queue.join()才会停止阻塞

代码解释

#关于tase_done()的作用:只有消费者把队列所有的数据处理完毕,queue.join()才会停止阻塞
import time
from queue import Queue
from threading import Thread
q = Queue()

def produce():
    for i in range(10):
        q.put(i)
        print('生产:',i)
    print('生产任务完毕!')
    q.join()
    print(produce.__name__,'函数结束!')

def consumer():
    for i in range(10):
        print('消费:', q.get())
        q.task_done()
        # if i == 4:
        #     print('休息1s...')
        #     time.sleep(1)#sleep作用:查看生产者是否阻塞
    print(consumer.__name__,'函数结束!')



pro = Thread(target=produce)
con = Thread(target=consumer)

pro.start()
con.start()

con.join()
print('消费者任务完成')
pro.join()
print('生产者任务完成')

生产: 0
生产: 1
生产: 2
生产: 3
生产: 4
生产: 5
消费: 0
消费: 1
消费: 2
消费: 3
消费: 4
消费: 5
生产: 6
生产: 7
生产:8
消费: 6
消费: 7
消费: 8
生产: 9
生产任务完毕!
消费: 9
consumer 函数结束!
produce 函数结束!
消费者任务完成
生产者任务完成

说明:生产任务已经完毕为什么没有直接produce函数结束?

说明这里产生了阻塞,产生阻塞的原因是因为消费者没有处理完生产者所有任务。

tase_done()的作用:只有消费者把队列所有的数据处理完毕,queue.join()才会停止阻塞所以才会有produce函数结束!然后生产任务结束。

对比解释看效果

注释掉q.task_done()和q.join()

#关于tase_done()的作用:只有消费者把队列所有的数据处理完毕,queue.join()才会停止阻塞
import time
from queue import Queue
from threading import Thread
q = Queue()

def produce():
    for i in range(10):
        q.put(i)
    print('生产任务完毕!')
    # q.join()
    # if i == 4:
        #     print('休息1s...')
        #     time.sleep(1)#sleep作用:查看生产者是否阻塞
    print(produce.__name__,'函数结束!')

def consumer():
    for i in range(10):
        print('消费:', q.get())
        # q.task_done()
    print(consumer.__name__,'函数结束!')



pro = Thread(target=produce)
con = Thread(target=consumer)

pro.start()
con.start()

con.join()
print('消费者任务完成')
pro.join()
print('生产者任务完成')

生产: 0
生产: 1
生产: 2
生产: 3
生产: 4
生产: 5
生产: 6
生产: 7
生产: 8
生产: 9
消费: 0
消费: 1
生产任务完毕!
produce 函数结束!
消费: 2
消费: 3
消费: 4
消费: 5
消费: 6
消费: 7
消费: 8
消费: 9
consumer 函数结束!
消费者任务完成
生产者任务完成

说明:不带task_done()和join()情况下生产任务结束,produce函数立刻结束,并没有等待消费者处理完所有任务立即结束。

仅注释掉q.task_done()**

#关于tase_done()的作用:只有消费者把队列所有的数据处理完毕,queue.join()才会停止阻塞
import time
from queue import Queue
from threading import Thread
q = Queue()

def produce():
    for i in range(10):
        q.put(i)
    print('生产任务完毕!')
    q.join()
    print(produce.__name__,'函数结束!')

def consumer():
    for i in range(10):
        print('消费:', q.get())
        # q.task_done()
        # if i == 4:
        #     print('休息1s...')
        #     time.sleep(1)#sleep作用:查看生产者是否阻塞
    print(consumer.__name__,'函数结束!')



pro = Thread(target=produce)
con = Thread(target=consumer)

pro.start()
con.start()

con.join()
print('消费者任务完成')
pro.join()
print('生产者任务完成')

生产: 0
生产: 1
生产: 2
生产: 3
生产: 4
生产: 5
生产: 6
生产: 7
生产: 8
生产: 9
生产任务完毕!
消费: 0
消费: 1
消费: 2
消费: 3
消费: 4
消费: 5
消费: 6
消费: 7
消费: 8
消费: 9
consumer 函数结束!
消费者任务完成
。。。阻塞。。。

说明:消费者已经把任务完成了,但是produce函数却一直阻塞没有结束。

总结

通过以上分析可以得出结论:

task_done()的作用:消费者处理一个任务,它就通知生产者我处理了一个任务。

为什么要告诉生产者消费者处理了一个任务呢?

这也是为什么我进行注释对比的原因

  • 1.注释q.task_done(),不注释q.join(),我们发现produce函数一直阻塞没有结束。
  • 2.注释q.task_done(),注释q.join(),我们发现生产者生产完任务produce函数就结束了,而不是等到消费者消费完才结束。这没有task_done和join:这个模型一定是生产者先生产任务,消费者发现有任务就消费(不然会阻塞等待),所以一定是生产者生产完后就马上结束生产而消费者还没有结束。
  • 3.不注释q.task_done(),不注释q.join(),我们发现produce函数在消费者消费完后才结束,而不是生产完就结束。

生产者如果被消费者的task_done()告知没有把生产者交给的任务处理完毕,那么生产者就会一直阻塞(生气…)。

大家可以把sleep()函数的注释删掉看看,并且设置任意一个sleep()时间观察现象。

如果只有q.join()而没有task_done(),消费者处理完所有任务,生产者任然阻塞,所以q.join()一般和q.task_done()配合使用。

最后

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: 关于生产消费者模型中task_done()的具体作用

本文链接: https://lsjlt.com/news/197502.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 关于生产消费者模型中task_done()的具体作用
    目录直奔主题代码解释对比解释看效果注释掉q.task_done()和q.join()仅注释掉q.task_done()**总结最后直奔主题 tase_done()的作用: 只有消费者...
    99+
    2023-02-25
    生产消费者模型 task_done()的作用 生产消费者
  • 生产消费者模型中的task_done()如何作用
    这篇文章主要讲解了“生产消费者模型中的task_done()如何作用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“生产消费者模型中的task_done()如何作用”吧!tase_done()...
    99+
    2023-07-05
  • Java中的生产者/消费者模型
    一、什么是生产者/消费者模型 生产者-消费者模型(Producer-Consumer problem)是一个非常经典的多线程并发协作的模型。 比如某个模块负责生产数据,而另一个模块负责处理数据。产生数据的模块就形象地被称为生产者;而处理数据...
    99+
    2023-10-05
    java 多线程 wait notify notifyAll
  • Python生产者与消费者模型中的优势有哪些
    这篇文章主要介绍“Python生产者与消费者模型中的优势有哪些”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python生产者与消费者模型中的优势有哪些”文章能帮助大家解决问题。生产者消费者模型具体...
    99+
    2023-07-05
  • python多进程中的生产者和消费者模型怎么实现
    这篇文章主要介绍了python多进程中的生产者和消费者模型怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇python多进程中的生产者和消费者模型怎么实现文章都会有所收获,下面我们一起来看看吧。Pytho...
    99+
    2023-07-05
  • 理解生产者消费者模型及在Python编程中的运用实例
    什么是生产者消费者模型 在 工作中,大家可能会碰到这样一种情况:某个模块负责产生数据,这些数据由另一个模块来负责处理(此处的模块是广义的,可以是类、函数、线程、进程等)。产 生数据的模块,就形象地称为生产者...
    99+
    2022-06-04
    生产者 实例 模型
  • Java线程通信中关于生产者与消费者案例分析
    相关方法: wait():一旦执行此方法,当前线程就进入阻塞状态,并释放同步监视器。 notify():一旦执行此方法,就会唤醒被wait的一个线程,如果有多个线程被wait,就唤醒...
    99+
    2024-04-02
  • 怎么在Python中利用 Asyncio模块实现一个生产消费者模型
    本文章向大家介绍怎么在Python中利用 Asyncio模块实现一个生产消费者模型的基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。Python主要用来做什么Python主要应用于:1、Web开发;2、数...
    99+
    2023-06-06
  • Java多线程中消费者与生产者的关系是什么
    这篇文章将为大家详细讲解有关Java多线程中消费者与生产者的关系是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。  多线程:CPU中各种任务在交替执行过程中,被称为多线程处理。其中,每个任务的一次动态...
    99+
    2023-06-02
  • Python中怎么利用多线程实现生产者消费者模式
    Python中怎么利用多线程实现生产者消费者模式,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。什么是生产者消费者模式在软件开发的过程中,经常碰到这样的场景:某些模块负责生产数据...
    99+
    2023-06-17
  • GoLang中怎么利用生产者消费者模式解决并发问题
    这期内容当中小编将会给大家带来有关GoLang中怎么利用生产者消费者模式解决并发问题,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。在主函数中创建一个管道,接收字符串类型产生数据,把数据放到管道中在管道中取...
    99+
    2023-06-05
  • java中的wait()和notify()方法实现生产者消费者模式实例
    这篇文章主要介绍“java中的wait()和notify()方法实现生产者消费者模式实例”,在日常操作中,相信很多人在java中的wait()和notify()方法实现生产者消费者模式实例问题上存在疑惑,小编查阅了各式资料,整理出简单好用的...
    99+
    2023-06-20
  • 队列的生产者与消费者模式在PHP与MySQL中的实现方法
    随着互联网业务的快速发展,系统中处理大量任务的需求变得越来越迫切。队列是一种常见的解决方案,可以高效地处理任务。队列的生产者-消费者模式(Producer-Consumer Pattern)在PHP和MySQL中的实现方法是一种常见的解决方...
    99+
    2023-10-21
    MySQL 消费者 PHP 队列 生产者
  • Java多线程中不同条件下编写生产消费者模型的示例分析
    这篇文章主要为大家展示了“Java多线程中不同条件下编写生产消费者模型的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java多线程中不同条件下编写生产消费者模型的示例分析”这篇文章吧。...
    99+
    2023-05-30
    java
  • JAVA项目中的生产者消费者如何利用多线程实现
    今天就跟大家聊聊有关JAVA项目中的生产者消费者如何利用多线程实现,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。JAVA多线程实现生产者消费者的实例详解Product.Javapac...
    99+
    2023-05-31
    java 多线程 ava
  • Java多线程Queue、BlockingQueue和使用BlockingQueue实现生产消费者模型方法解析
    Queue是什么队列,是一种数据结构。除了优先级队列和LIFO队列外,队列都是以FIFO(先进先出)的方式对各个元素进行排序的。无论使用哪种排序方式,队列的头都是调用remove()或poll()移除元素的。在FIFO队列中,所有新元素都插...
    99+
    2023-05-30
    java 多线程 生产消费者
  • Python爬虫程序中使用生产者与消费者模式时进程过早退出的问题
    之前写爬虫程序的时候,采用生产者和消费者的模式,利用Queue作为生产者进程和消费者进程之间的同步队列。 执行程序时,总是秒退,加了断点也无法中断,加打印也无法输出,我知道肯定是进程...
    99+
    2023-01-06
    Python生产者与消费者模式进程早退 Python 进程早退
  • 关于spring中单例Bean引用原型Bean产生的问题及解决
    目录spring单例Bean引用原型Bean产生的问题及解决问题描述为了更直观的发现问题,下面我们用代码演示一遍问题分析spring Bean的几个相关问题1.Spring Bean...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作