Python并发concurrent.futures和asyncio实例

Python并发编程有多种方式,其中concurrent.futuresasyncio是比较流行的两种方式。本文将介绍如何使用concurrent.futuresasyncio实现并发编程,包括如何使用线程池和进程池,以及如何使用异步编程和协程。

concurrent.futures实例

线程池示例

线程池的使用可以大大减少线程的创建和销毁,提高程序的性能。下面是一个使用线程池的示例,该示例调用了concurrent.futures.ThreadPoolExecutor来创建一个线程池,然后使用submit方法往线程池中提交任务,最后通过as_completed方法获取执行结果。

import concurrent.futures
import time

def worker(num):
    """
    模拟耗时工作
    """
    print(f"start working {num}")
    time.sleep(1)
    print(f"done working {num}")
    return num * num

with concurrent.futures.ThreadPoolExecutor(max_workers=2) as executor:
    # 提交任务
    results = [executor.submit(worker, i) for i in range(5)]
    # 获取执行结果
    for future in concurrent.futures.as_completed(results):
        result = future.result()
        print(f"result: {result}")

输出:

start working 0
start working 1
done working 0
result: 0
start working 2
done working 1
result: 1
start working 3
done working 2
result: 4
start working 4
done working 3
result: 9
done working 4
result: 16

进程池示例

进程池的使用与线程池类似,只需要将ThreadPoolExecutor改为ProcessPoolExecutor即可。下面是一个使用进程池的示例,该示例调用了concurrent.futures.ProcessPoolExecutor来创建一个进程池,然后使用submit方法往进程池中提交任务,最后通过as_completed方法获取执行结果。

import concurrent.futures
import time

def worker(num):
    """
    模拟耗时工作
    """
    print(f"start working {num}")
    time.sleep(1)
    print(f"done working {num}")
    return num * num

with concurrent.futures.ProcessPoolExecutor(max_workers=2) as executor:
    # 提交任务
    results = [executor.submit(worker, i) for i in range(5)]
    # 获取执行结果
    for future in concurrent.futures.as_completed(results):
        result = future.result()
        print(f"result: {result}")

输出:

start working 0
start working 1
done working 0
result: 0
start working 2
start working 3
done working 1
result: 1
done working 2
result: 4
start working 4
done working 3
result: 9
done working 4
result: 16

asyncio实例

异步编程示例

使用asyncio实现异步编程,需要用到asyncawait关键字。下面是一个使用asyncio实现异步编程的示例,该示例定义了一个协程函数count,使用await asyncio.sleep(1)模拟耗时操作,然后通过await asyncio.gather(*tasks)等待多个协程执行完成。

import asyncio
import time

async def count(num):
    """
    模拟耗时操作
    """
    print(f"start working {num}")
    await asyncio.sleep(1)
    print(f"done working {num}")
    return num * num

async def main():
    """
    异步执行任务
    """
    tasks = [count(i) for i in range(5)]

    results = await asyncio.gather(*tasks)

    for result in results:
        print(f"result: {result}")

asyncio.run(main())

输出:

start working 0
start working 1
done working 0
result: 0
start working 2
done working 1
result: 1
start working 3
done working 2
result: 4
start working 4
done working 3
result: 9
done working 4
result: 16

协程示例

协程是一个轻量级的并发编程方式,可以用asyncawait关键字定义。下面是一个使用协程实现异步编程的示例,该示例定义了一个协程函数count,使用await asyncio.sleep(1)模拟耗时操作,然后使用asyncio.create_task方法创建一个任务,并通过await task等待任务执行完成。

import asyncio
import time

async def count(num):
    """
    模拟耗时操作
    """
    print(f"start working {num}")
    await asyncio.sleep(1)
    print(f"done working {num}")
    return num * num

async def main():
    """
    协程执行任务
    """
    tasks = [count(i) for i in range(5)]

    for task in tasks:
        result = await task
        print(f"result: {result}")

asyncio.run(main())

输出:

start working 0
done working 0
result: 0
start working 1
done working 1
result: 1
start working 2
done working 2
result: 4
start working 3
done working 3
result: 9
start working 4
done working 4
result: 16

以上是Python并发编程中concurrent.futuresasyncio的使用示例,可以根据具体场景选择不同的方式来实现并发编程。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python并发concurrent.futures和asyncio实例 - Python技术站

(0)
上一篇 2023年6月6日
下一篇 2023年6月6日

相关文章

  • Python中的单例模式与反射机制详解

    下面我将详细讲解“Python中的单例模式与反射机制详解”的完整攻略。 什么是单例模式? 在软件开发中,单例模式是一种常见的设计模式。它使用一个特定的类来保证类只有一个实例,并且提供全局访问点。 在 Python 中,我们可以使用一个装饰器来实现单例模式。 下面是一个实现单例模式的示例代码: def singleton(cls): instances = {…

    python 2023年5月18日
    00
  • Python基于回溯法子集树模板解决最佳作业调度问题示例

    Python基于回溯法子集树模板解决最佳作业调度问题示例 前言 本文将讲解利用回溯法子集树模板来解决最佳作业调度问题的详细攻略。 回溯法是一种常见的算法思想,可以用于解决多个问题,其中之一就是最佳作业调度问题。最佳作业调度问题是指在多个作业执行时间固定的情况下,如何安排这些作业的执行顺序,能够使得作业总执行时间最短。本文中将基于回溯法子集树模板来解决最佳作业…

    python 2023年5月31日
    00
  • 关于python time库整理汇总

    关于Python time库整理汇总 什么是Python time库? Python time 库是Python中标准的日期和时间处理库,它提供了很多与时间相关的功能函数。使用 time 库可以完成日期和时间的格式化、获取时间戳、获取本地时间、获取UTC时间等操作。 Python time库的安装 time 库是Python标准库的一部分,所以不需要安装就可…

    python 2023年6月2日
    00
  • python 集合常用操作汇总

    Python 集合常用操作汇总 什么是集合 集合(set)在 Python 中是一种无序且不重复的数据类型,它非常适合用于去重操作。可以使用大括号 {} 或者 set() 函数来创建集合。 集合的常用操作 以下是集合常用的操作汇总: 创建集合 我们可以使用大括号 {} 来创建集合,例如: s = {1, 2, 3} 也可以使用 set() 函数来创建集合,例…

    python 2023年5月13日
    00
  • Python中如何给字典设置默认值

    给字典设置默认值在Python中是一种很常见的操作。如果一个字典没有某一个键,则会出现KeyError的错误。但是,我们可以设置默认值,这样,如果字典没有某个键,则会返回我们设置的默认值。下面介绍两种方法。 方法1:使用dict.setdefault方法 dict.setdefault方法可以设置字典的默认值,其函数定义如下: dict.setdefault…

    python 2023年5月13日
    00
  • python实战练习做一个随机点名的程序

    下面是python实战练习做一个随机点名的程序的完整攻略: 问题描述 点名是很多老师在课堂上进行的一项活动,目的是为了调动学生的积极性和听课注意力。但是,人工点名有可能存在偏差和不公平,因此我们希望用程序来实现随机点名。该程序需要能随机从给定学生名单中取出一个名字,并输出结果。 解决方案 本程序主要分为三个部分: 学生名单的定义 随机点名功能的编写 输出结果…

    python 2023年6月3日
    00
  • 使用Pandas修改DataFrame中某一列的值

    以下是“使用Pandas修改DataFrame中某一列的值”的完整攻略: 一、问题描述 在Pandas中,DataFrame是一种二维表格数据结构,其中每一列可以是不同的数据类型。本文将详细讲解如何使用Pandas修改DataFrame中某一列的值。 二、解决方案 2.1 修改DataFrame中某一列的值 在Pandas中,我们可以使用df[‘column…

    python 2023年5月14日
    00
  • python生成多个只含0,1元素的随机数组或列表的实例

    生成指定大小的只含0,1元素的随机数组或列表,一般可以使用Python中的numpy库或random库实现。下面详细介绍两种方法。 方法一:使用numpy库 import numpy as np # 定义生成大小为(3, 4)的二维随机数组 arr = np.random.randint(0, 2, size=(3, 4)) print(arr) 解释: 导…

    python 2023年6月3日
    00
合作推广
合作推广
分享本页
返回顶部