首页 > 其他分享 >池和异步回调机制

池和异步回调机制

时间:2024-01-20 18:44:26浏览次数:16  
标签:__ 异步 task 线程 import 机制 回调 pool

【1】概念

  • 池是用来保证计算机硬件安全的情况下,最大限度的利用计算机资源,降低了程序的运行效率,但是保证了计算机硬件的安全

  • 池(Pool)的概念在计算机科学和软件工程中常被用于资源管理,尤其是在多线程或并发编程中。池是一种管理和优化资源分配的机制,它事先分配一定数量的资源(如线程、数据库连接、对象等),并在需要时重用这些资源,而不是每次都创建和销毁。

【2】类型

  1. 线程池(Thread Pool):线程池维护一组预先创建的线程,这些线程可以执行多个任务。当一个任务提交给线程池时,线程池会尝试使用一个空闲的线程来执行该任务。使用线程池可以减少因为频繁创建和销毁线程而产生的开销,提高响应速度,同时限制并发线程的数量,防止资源过度使用。
  2. 进程池(Process Pool):与线程池类似,进程池维护一组预先创建的进程。这在并行处理和分布式计算中非常有用,尤其是当每个任务需要大量计算资源时。
  3. 数据库连接池(Database Connection Pool):在数据库应用中,建立数据库连接是一个资源密集和时间消耗的操作。数据库连接池预先创建一定数量的数据库连接,并在需要时重用这些连接,提高了数据库操作的效率。
  4. 对象池(Object Pool):对象池用于管理对象的创建和分配。它维护一组已经初始化的对象。当需要一个新对象时,可以从池中获取,使用后再放回池中,而不是销毁。

【3】优势

  • 提高性能:通过减少创建和销毁资源的次数,减少系统开销。
  • 资源复用:已分配的资源可以被多次重用,提高资源利用率。
  • 控制上限:限制同时活跃的资源数量,防止因过多资源同时使用而耗尽系统资源。

线程池

【1】导入方法

  • from concurrent.futures import ThreadPoolExecutor

【2】使用方法

  • 先实例化一个线程池对象t_pool = ThreadPoolExecutor(5)
  • 这里的参数可以自己填,不填的话,默认就是电脑cpu个数乘5
  • t_list = [t_pool.submit(task, i) for i in range(1, 51)]通过submit()方法向线程池中提交任务
  • submit(task, i)第一个参数是函数名,第二个参数是函数的参数
  • 通过result()方法可以得到线程池里的线程的返回值
  • shutdown()方法可以使线程池关闭,不再处理新的任务,但是会处理已经提交给线程池内部正在运行,以及在队列中还未运行的线程

【3】进房间洗脚例子

from concurrent.futures import ThreadPoolExecutor
import time


def task(i):
    print(f'客户{i}来到了房间洗脚')
    time.sleep(2)
    return f'客户{i}来洗脚啦'


if __name__ == '__main__':
    t_pool = ThreadPoolExecutor(5)

    t_list = [t_pool.submit(task, i) for i in range(1, 51)]
    t_pool.shutdown()
    for t in t_list:
        print(t.result())

  • 首先将任务添加到线程池,然后再关闭线程池,等待所有线程起来之后,最后再一起输出结果
  • 也可以使用with ThreadPoolExecutor(3) as p_pool:自动执行shutdown()方法

进程池

【1】导入方法

  • from concurrent.futures import ProcessPoolExecutor

【2】使用方法

  • 进程池的使用方法和线程池基本一致
  • 但是如果不给进程池传入参数时,默认值会是当前电脑cpu的个数

【3】池里面的进程或者线程是不会变的

  • 上面的线程池不太好说明
  • 但是进程池就可以很好的印证这一点
  • 还是一样的洗脚例子
from concurrent.futures import ProcessPoolExecutor
import os
import time


def task(i):
    pid = os.getpid()
    time.sleep(1)
    print(f'客户{i}进入房间洗脚----客户的手牌号为{pid}')


if __name__ == '__main__':
    p_pool = ProcessPoolExecutor(3)
    p_list = [p_pool.submit(task, i) for i in range(1, 21)]
  • 打印 出来观察结果,可以发现进程池里面的进程ID是不变的,永远都是那么几个

异步回调机制

【1】介绍

  • 异步回调机制是一种编程模式,它允许程序在执行长时间运行的任务时继续执行其他代码,并在这些长时间运行的任务完成后得到通知。
  • 结合上面的例子,我们想要拿到线程的返回值,但是拿到返回值就需要1秒的阻塞,用了异步回调函数之后,就可以实现线程的并发,等到拿到了函数的返回值,再调回来拿结果。

【2】异步回调的优势

  • 非阻塞行为:主程序可以继续执行其他任务,而不必等待长时间运行的任务完成。

  • 简化代码结构:回调机制允许我们将后续处理逻辑清晰地与长时间运行的任务分离。

  • 提高响应性:在用户界面或网络应用中,异步回调能够提高程序的响应性,因为主线程不会被长时间运行的任务阻塞。

  • 异步回调在现代编程中非常普遍,特别是在处理I/O操作(如文件读写、网络请求)或其他需要等待的任务时。

【3】例子

from concurrent.futures import ProcessPoolExecutor
import os
import time


def task(i):
    pid = os.getpid()
    time.sleep(2)
    print(f'客户{i}进入房间洗脚----客户的手牌号为{pid}')
    return f'客户{i}来洗脚啦'

def result(future):
    print(future.result())


if __name__ == '__main__':
    p_pool = ProcessPoolExecutor(3)
    p_list = [p_pool.submit(task, i).add_done_callback(result) for i in range(1, 11)]

  • add_done_callback()调用这个方法会自动将p_pool对象作为第一个参数传入,而这个对象就有一个result()方法可以拿到返回值
  • 定义了一个result函数,参数是future对象,也就是p_pool对象,函数内容就是输出p_pool对象的返回值,然后再将这个函数地址作为add_done_callback()的参数传入

标签:__,异步,task,线程,import,机制,回调,pool
From: https://www.cnblogs.com/Hqqqq/p/17976976

相关文章

  • Python中的回调函数
    先来看一个程序:deff1():print(2)return1deff2(a):print(3)returnaprint(f2(f1()))这个程序,在调用时,f2会先等待f1调用完毕,返回1之后,再进行调用,所以会输出2、3、1,但是若这样改写程序deff1():print(2)return1deff2(f):prin......
  • 什么是注意力机制?
    什么是注意力机制注意力机制(AttentionMechanism)是一种在深度学习模型中模拟人类注意力的技术。它的主要思想是,当我们处理一个任务时,我们不会平等地对待所有的信息,而是会将注意力集中在某些关键的部分。例如,当我们阅读一段文本时,我们会更关注与当前任务相关的词汇和句子,而忽略其......
  • 基于自注意力机制的轻量级人体姿态估计(Lightweight Human Pose Estimation Based on
    写在前面本文是一篇于2023年3月21日发表在2023InternationalConferenceonBigData,EnvironmentalIndustryandMaterialsScience(ICBDEIMS2023)的一篇会议论文。论文主要聚焦于解决单签人体姿态估计网络模型中普遍存在的参数多、计算复杂度高、检测时间长的问题,文章采用......
  • Python异步编程原理篇之协程的IO
    协程的IOasyncio作为实现异步编程的库,任务执行中遇到系统IO的时能够自动切换到其他任务。协程使用的IO模型是IO多路复用。在asyncio低阶API一篇中提到过“以Linux系统为例,IO模型有阻塞,非阻塞,IO多路复用等。asyncio常用的是IO多路复用模型的epool和kqueue”。本篇就介绍一......
  • 异步与自动化
    异步数据之前爬取的网站基本上都是同步数据,每一页的内容都不需要再次加载,而是通过翻页获取更多数据;其实有很多网站显示在页面上的的数据并不是一次性从服务端获取的,如图像搜索网站,当滚动下拉条时,会随着滚动条向下移动,有更多的图片显示出来。这些图片就是通过异步的方不断从服务端......
  • 美多商城用户注册-展示用户注册页面-短信验证码异步方案Celery-8
    生产者消费者设计模式生产设消费者设计模式介绍Celery介绍使用:Celery介绍:一个简单、灵活且可靠、处理大量消息的分布式系统,可以在一台或者多台机器上运行。单个Celery进程每分钟可处理数以百万计的任务。通过消息进行通信,使用消息队列(broker)在客户端和消费者之间进行协调......
  • 不同版本Nacos原理之临时/永久实例,注册服务,心跳保活,服务发现,责任机制
    目录1Nacos原理1.1临时实例和永久实例1.1.1临时实例1.1.2永久实例1.1.3应用场景1.2服务注册1.2.11.x版本的实现1.2.22.x版本的实现1.2.2.1通信协议的改变1.2.2.2具体的实现1.2.3服务注册总结1.3心跳机制1.3.11.x心跳实现1.3.22.x心跳实现1.3.3心跳机制总结1.4健康......
  • 异步加载树形组件(antd-vue)
    1、html<a-directory-tree:tree-data="useDataSourceTreeList"v-model:selectedKeys="selectedKey"v-if="datasourceId"blockNodeclass="tree-card":showIco......
  • C# Task 异步的一些流程简单测试 Task 测试 异步测试
    测试程序:publicclassTAKS_TEST{privatereadonlyDictionary<int,Task<T_TEST>>DataDic=newDictionary<int,Task<T_TEST>>();privateT_TESTGetRes(inti){Thread.Sleep(i*1000);returnnewT_TEST(){......
  • Stream (是异步版本的列表)、StreamBuilder(局部数据更新)
    Stream流Stream的字面意思是水流,Stream不像Future那样只会在未来获取一个值,它可以异步获取0个或者多个值。如果说Future是一个异步版本的int或者String,Stream则更像是异步版本的列表,List,List,列表里面可能会有0个或者多个元素。classMyHomePageextendsStatefulWidget{......