首页 > 其他分享 >几种并发模式的实现

几种并发模式的实现

时间:2024-09-10 10:05:49浏览次数:10  
标签:task 结果 模式 几种 并发 任务 result print 执行

常见的几个需要并发的场景,具体的实现方式

  • asyncio异步并发

    import asyncio
    
    async def task(id, delay):
        await asyncio.sleep(delay)
        return f"Task {id} completed"
    
    async def main():
        tasks = [task(1, 2), task(2, 1), task(3, 3)]
        done, pending = await asyncio.wait(tasks, return_when=asyncio.ALL_COMPLETED)
        for completed_task  in done:
            try:
                result = await completed_task
                print(result)
            except Exception as e:
                print(f"An error occurred: {e}")
    
    asyncio.run(main())
    
    #返回结果:Task 2 completed  Task 3 completed  Task 1 completed
    
    • 注意点
      若只想运行任务而不需要返回结果,不阻塞程序,则可以直接asyncio.create_task(),只创建完任务便可。后续若再想要结果,则再查看这个任务的返回结果便可。
      与其相关的无论是异步函数,还是常规函数,还是第三方库里面的函数。全部不能用time.sleep()这种阻塞,只能使用异步的sleep。因此要详细查看相关函数,是否有这种调用。
  • Thread多线程并发

    from concurrent.futures import ThreadPoolExecutor,as_completed,wait
    import time
    
    def task(n):
        print(f"开始执行任务 {n}")
        if n == 0:
            time.sleep(2.5)
        else:
            time.sleep(n)
        print(f"任务 {n} 执行完毕")
        return n * n
    
    with ThreadPoolExecutor(max_workers=5) as executor:
        futures = [executor.submit(task, i) for i in range(5)]
    
        # 方式一:按照“提交顺序”获取排列的Future对象
        # for future in futures:
        #     result = future.result()
        #     print(f"任务结果:{result}")
        
        # 方式二:使用as_completed,按照“完成顺序”获取排列的Future对象,实时返回
        # for future in as_completed(futures):
        #     result = future.result()
        #     print(f"任务结果:{result}")
            
        # 方式三:等待所有任务都完成后,返回结果,无顺序
        done, not_done = wait(futures)
        for future in done:
            result = future.result()
            print(f"任务结果:{result}")
    方式一结果:
    开始执行任务 0
    开始执行任务 1
    开始执行任务 2
    开始执行任务 3
    开始执行任务 4
    任务 1 执行完毕
    任务 2 执行完毕
    任务 0 执行完毕
    任务结果:0
    任务结果:1
    任务结果:4
    任务 3 执行完毕
    任务结果:9
    任务 4 执行完毕
    任务结果:16
    
    方式二结果:
    开始执行任务 0
    开始执行任务 1
    开始执行任务 2
    开始执行任务 3
    开始执行任务 4
    任务 1 执行完毕
    任务结果:1
    任务 2 执行完毕
    任务结果:4
    任务 0 执行完毕
    任务结果:0
    任务 3 执行完毕
    任务结果:9
    任务 4 执行完毕
    任务结果:16
    
    方式三结果:
    开始执行任务 0
    开始执行任务 1
    开始执行任务 2
    开始执行任务 3
    开始执行任务 4
    任务 1 执行完毕
    任务 2 执行完毕
    任务 0 执行完毕
    任务 3 执行完毕
    任务 4 执行完毕
    任务结果:1
    任务结果:9
    任务结果:4
    任务结果:0
    任务结果:16
    
  • multiprocessing多进程并发

    from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor,as_completed,wait
    import time
    
    def task(n):
        print(f"开始执行任务 {n}")
        if n == 0:
            time.sleep(2.5)
        else:
            time.sleep(n)
        print(f"任务 {n} 执行完毕")
        return n * n
    if __name__ == '__main__':
        # with ThreadPoolExecutor(max_workers=5) as executor:
        executor = ProcessPoolExecutor(max_workers=5)
        futures = [executor.submit(task, i) for i in range(5)]
    
        # 方式一:按照“提交顺序”获取排列的Future对象
        # for future in futures:
        #     result = future.result()
        #     print(f"任务结果:{result}")
    

    与多线程使用方式相同

标签:task,结果,模式,几种,并发,任务,result,print,执行
From: https://www.cnblogs.com/lanmi/p/18405179

相关文章

  • STM32八种工作模式
    一:模式介绍1.1四种输入模式:1.2四种输出模式:二:模式框图三:模式解析3.1模拟输入模拟输入,即关闭施密特触发器,将电压信号传送到片上外设模块(不接上、下拉电阻)。通常是用于ADC采集电压输入通道,进行AD转换。3.2浮空输入浮空输入。浮空输入状态下,IO的电平状态是不确定的,完......
  • FreeBSD兼容模式linux账户指向FreeBSD账户造成的困扰
    发现FreeBSD兼容模式linux账户指向FreeBSD账户,这导致账户出现了紊乱。比如FreeBSD下账户guest的id是1001,linux兼容模式下的guest账户id是1004#FreeBSD下目录归属drwxr-xr-x71skywalkskywalk1089月613:59skywalk#Linux下mud归属drwxr-xr-x71linuxskywalk......
  • 案例分析:如何用设计模式优化性能1
    设计模式就是对常用开发技巧进行的总结,它使得程序员之间交流问题,有了更专业、便捷的方式。比如,我们在《02|理论分析:性能优化有章可循,谈谈常用的切入点》中提到,I/O模块使用的是装饰器模式,你就能很容易想到I/O模块的代码组织方式。事实上,大多数设计模式并不能增加程序的性......
  • 案例分析:如何用设计模式优化性能12
    设计模式就是对常用开发技巧进行的总结,它使得程序员之间交流问题,有了更专业、便捷的方式。比如,我们在《02|理论分析:性能优化有章可循,谈谈常用的切入点》中提到,I/O模块使用的是装饰器模式,你就能很容易想到I/O模块的代码组织方式。事实上,大多数设计模式并不能增加程序的性......
  • 案例分析:如何用设计模式优化性能2
    设计模式就是对常用开发技巧进行的总结,它使得程序员之间交流问题,有了更专业、便捷的方式。比如,我们在《02|理论分析:性能优化有章可循,谈谈常用的切入点》中提到,I/O模块使用的是装饰器模式,你就能很容易想到I/O模块的代码组织方式。事实上,大多数设计模式并不能增加程序的性......
  • 二、并发编程与多线程-2.2、多线程(中)
    2.2、多线程(中)2.2.4、为什么启动线程不能直接调用run()方法?调用两次start()方法会有什么后果?答:在Java中,启动线程不能直接调用run()方法的原因是,run()方法是线程的执行体,通过调用start()方法来启动线程可以创建一个新的线程并使其运行。如果直接调用run()方法,则会在当前线......
  • 单例设计模式2(饿汉式)
    今天我们来讲的是单例设计模式中的饿汉式。咱们依旧先从字面上面先了解,饿汉说明了饭量大,要吃的食物很多。饿汉式的名字就是因为它所占用的内存相对较高,但是它的效率也要较高。因为饿汉式不管你现在要不要该对象,只要我们的类加载了,就会把对象创建出来,然后占用内存。饿汉式不管......
  • [Java并发]sleep
    Thread.sleep是Java中用来让当前线程进入休眠状态一段时间的方法。调用Thread.sleep后,线程会进入“等待”状态,直到指定的时间过去,然后自动被唤醒继续执行。但Thread.sleep并不是在其他线程的干预下被唤醒的,而是依赖以下几个条件之一来结束休眠:时间到达:当指定的睡眠时间......
  • 海豚调度器(DolphinScheduler)单机模式的部署与使用
    一、概述1、什么是DolphinScheduler  ApacheDolphinScheduler(下面简称DS) 是一个为企业级应用场景设计的开源任务调度系统,它提供了分布式的、可扩展的并且易于使用的可视化界面,让用户能够高效地管理和调度复杂的工作流任务,覆盖从任务创建到监控的全生命周期数据处理流程......
  • Java单例设计模式(懒汉式与饿汉式)
    思考这样一个问题如果要在类的外部有且只有一个对象,我们需要怎么做呢首先要保证构造方法私有化,保证不能用new的方法来在外部创建对象一.单例设计模式单例设计模式是一种常见的设计模式,用于确保一个类只有一个实例,并提供一个全局访问点来访问该实例。无论是懒汉式还是饿汉......