python 基于异步的编程

2023-11-01

背景

除了顺序执行和并行执行的模型之外,还有第三种模型,叫做异步模型,这是事件驱动模型的基础。异步活动的执行模型可以只有一个单一的主控制流,能在单核心系统和多核心系统中运行。

在并发执行的异步模型中,许多任务被穿插在同一时间线上,所有的任务都由一个控制流执行(单一线程)。任务的执行可能被暂停或恢复,中间的这段时间线程将会去执行其他任务。下面的这幅图可以清楚地表达这个概念。
这里写图片描述

如上图所示, 任务(不同颜色代替不同的任务) 可能被其他的任务插入, 但是都处于同一线程,下。 这表明, 当某一个任务执行时候, 其他任务都暂停啦。 与多线程编程模型不同的是, 多线程由操作系统决定在时间线上面什么时候挂起某个活动或者恢复某个活动, 而在异步编程模型中, 程序员必须假设线程可能在任何时间被挂起和替换。

程序员可以将任务写成许多可以间隔执行的小步骤,这样的化如果一个任务需要另外一个任务的输出, 那么被依赖的任务必须接受他的输入

使用python 中的concurrent.futures 模块

python3.2 带来了concurrent.future 模块, 这个模块具有线程池和进程池, 管理并行编程任务, 处理非确定性的执行流程, 进程/线程同步等功能
此模块由以下部分组成:

  • concurrent.futures.Executor: 这是一个虚拟基类,提供了异步执行的方法。
  • submit(function, argument): 调度函数(可调用的对象)的执行,将 argument 作为参数传入。
  • map(function, argument): 将 argument 作为参数执行函数,以 异步 的方式。
  • shutdown(Wait=True): 发出让执行者释放所有资源的信号。
  • concurrent.futures.Future: 其中包括函数的异步执行。Future对象是submit任务(即带有参数的functions)到executor的实例。

使用线程池和进程池

线程池或者进程池是用于在程序中优化和简化进程线程的使用。 通过池, 你可以提交任务给executor。 池由两部分组成, 一部分是内部的队列, 存放着待执行的任务;另一部分是一系列的进程和线程, 用于执行这些任务。池的概念主要目的是为了重用: 让线程或者进程在生命周期内可以多次使用。 它减少了创建线程和进程的开销, 提高了程序的性能。 重用不是必须的规则, 但是它是程序员在应用中使用池的主要原因。
这里写图片描述

准备工作

current.Futures 模块提供了两种Executor 的子类,各自独立操作一个线程池和进程池

concurrent.futures.ThreadPoolExecutor(max_works)
concurrent.futures.ProcessPoolExecutor(max_works)

下面展示 线程池进程池的功能

给一个list number_list ,包含1到10。对list中的每一个数字,乘以1+2+3…+10000000的和(这个任务只是为了消耗时间)
分别测试

  • 顺序执行
  • 通过有5个worker的线程池执行
  • 通过有5个worker的进程池执行
import concurrent.futures
import time

# number_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
number_list = [1, 2, 3, 4, 5]


def evaluate_item(x):
    # 计算总和,这里只是为了消耗时间
    result_item = count(x)
    # 打印输入和输出结果
    return result_item


def count(number):
    for i in range(0, 10000000):
        i = i + 1
    return i * number


if __name__ == "__main__":
    # 顺序执行
    start_time = time.time()
    for item in number_list:
        print(evaluate_item(item))
    print("Sequential execution in " + str(time.time() - start_time), "seconds")
    # 线程池执行
    start_time_1 = time.time()
    with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
        futures = [executor.submit(evaluate_item, item) 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python 基于异步的编程 的相关文章

  • Flask+Nginx+uWSGI:导入错误:没有名为站点的模块

    我安装为http www reinbach com uwsgi nginx flask virtualenv mac os x html http www reinbach com uwsgi nginx flask virtualenv
  • 如何使用 pyinstaller 包含文件?

    我也使用 tkinter 使用 python 3 7 编写了一个程序 由于我使用的是外部图片 因此当我将所有内容编译为一个 exe 时 我需要包含它们 我试过做 add data bg png files 但我仍然收到此错误 tkinter
  • 切片稀疏(scipy)矩阵

    我将不胜感激任何帮助 以理解从 scipy sparse 包中切片 lil matrix A 时的以下行为 实际上 我想根据行和列的任意索引列表提取子矩阵 当我使用这两行代码时 x1 A list 1 x2 x1 list 2 一切都很好
  • Kivy - 文本换行工作错误

    我正在尝试在 Kivy 1 8 0 应用程序中换行文本 当没有太多文字时 一切正常 但如果文本很长并且窗口不是很大 它只是剪切文本 这是示例代码 vbox BoxLayout orientation vertical size hint y
  • Python从int到string的快速转换

    我正在用 python 求解大量阶乘 并发现当我完成计算阶乘时 需要相同的时间才能转换为字符串以保存到文件中 我试图找到一种将 int 转换为字符串的快速方法 我将举一个计算和 int 转换时间的例子 我正在使用通用的 a str a 但感
  • Tweepy StreamListener 到 CSV

    我是 python 新手 我正在尝试开发一个应用程序 使用 Tweepy 和 Streaming API 从 Twitter 检索数据并将数据转换为 CSV 文件 问题是此代码不会创建输出 CSV 文件 也许是因为我应该将代码设置为在实现例
  • 了解 Python 中的酸洗

    我最近接到一项作业 需要以腌制形式放置一本字典 其中每个键引用一个列表 唯一的问题是我不知道腌制形式是什么 谁能给我指出一些好的资源的正确方向来帮助我学习这个概念 pickle 模块实现了一个基本但强大的算法 用于序列化和反序列化 Pyth
  • Python Fabric - 未找到主机。请指定用于连接的(单个)主机字符串:

    如何获取 找不到主机 请指定用于连接的 单个 主机字符串 面料如何解决 def bootstrap host ec2 54 xxx xxx xxx compute 1 amazonaws com env hosts host env use
  • PySide6.1 与 matplotlib 3.4 不兼容

    当我只安装PySide6时 GUI程序运行良好 但是一旦我安装了matplotlib及其依赖包 包括pyqt5 则GUI程序将无法运行并输出以下错误消息 This application failed to start because no
  • 如何使用 Django 项目设置 SQLite?

    我已阅读 Django 文档 仅供参考 https docs djangoproject com en 1 3 intro tutorial01 https docs djangoproject com en 1 3 intro tutor
  • django-admin.py makemessages 不起作用

    我正在尝试翻译一个字符串 load i18n trans Well Hello there how are you to Hola amigo que tal 我的 settings py 文件有这样的内容 LOCALE PATHS os
  • Python 惰性迭代器

    我试图了解迭代器表达式如何以及何时被求值 以下似乎是一个懒惰的表达 g i for i in range 1000 if i 3 i 2 然而 这个在构造上失败了 g line strip for line in open xxx r if
  • 如何使用 sys.path.append 在 Python 中导入文件?

    我的桌面上有两个目录 DIR1 and DIR2其中包含以下文件 DIR1 file1 py DIR2 file2 py myfile txt 这些文件包含以下内容 file1 py import sys sys path append s
  • PyTorch DataLoader 对并行运行的批次使用相同的随机种子

    有一个bug https tanelp github io posts a bug that plagues thousands of open source ml projects 在 PyTorch Numpy 中 当并行加载批次时Da
  • Python 类型安全吗?

    根据维基百科 https en wikipedia org wiki Type system Type safety and memory safety 如果一种语言不允许违反类型系统规则的操作或转换 计算机科学家就认为该语言是 类型安全的
  • 在 Sphinx 中,有没有办法在声明参数的同时记录参数?

    我更喜欢在声明参数的同一行记录每个参数 根据需要 以便应用D R Y http en wikipedia org wiki Don t repeat yourself 如果我有这样的代码 def foo flab nickers a ser
  • Python]将两个文本文件合并为一个(逐行)[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我是蟒蛇新手 我想做的是将文件 a 和文件 b 逐行合并到一个文件中 例如 text file a a n b n c text fi
  • 如何使用 Keras ImageDataGenerator 预测单个图像?

    我已经训练 CNN 对图像进行 3 类分类 在训练模型时 我使用 keras 的 ImageDataGenerator 类对图像应用预处理功能并重新缩放它 现在我的网络在测试集上训练得非常准确 但我不知道如何在单图像预测上应用预处理功能 如
  • 更改 Python Cmd 模块处理自动完成的方式

    我有一个 Cmd 控制台 设置为自动完成 Magic the Gathering 收藏管理系统的卡牌名称 它使用文本参数在数据库中查询卡片 并使用结果自动完成 建议卡片 然而 这些卡片名称有多个单词 Cmd 会从last到行尾的空间 例如
  • Python 通过从现有 csv 文件中过滤选定的行来写入新的 csv 文件

    只是一个问题 我试图将 csv 文件中的选定行写入新的 csv 文件 但出现错误 我试图读取的 test csv 文件是这样的 两列 2013 9 1 2013 10 2 2013 11 3 2013 12 4 2014 1 5 2014

随机推荐

  • 出现了一个意外,不能完成你在设置中所要求的更改

    今天叫了师傅来装宽带 在配置IP地址的时候出现了这样的情况 本来我里面是有以前设置的IP地址和DNS服务器地址 现在要更改成自动获取 结果总是弹出这样的错误信息来 有点烦 师傅忙活了半天 也没能搞定 正巧到了饭点 他叫我先自己弄弄 他先回去
  • 嘉立创投板笔记-Altum Designer机械层对板子形状的影响

    本次采用最简单的zip下单 操作部分记录如下 板子边框层用嘉立创建议的机械层1 mechanical 1 虽然 3D图仅供参考 具体以实物为准 但是嘉立创自家的3D解析想必也能反映出一定的形状识别逻辑的 注意 本笔记仅供参考 具体说法以嘉立
  • facenet代码注释

    facenet识别中的embedding代码块 import tensorflow as tf import numpy as np import sys import os import copy sys path append alig
  • 原型绘制提效技巧分享

    不管是前台PM还是后台PM 在工作中或多或少都要进行原型设计 原型可以说是产品 开发 测试之间进行交流沟通最重要的文档之一 那么怎么把原型画得又快又好呢 从设计流程上看 原型设计节点包括但不限于梳理需求大纲 规划页面结构 完善信息结构 绘制
  • 存储器了解

    1 sdio 之前弄过一个wifi模块 在stm32单片机上 基于sdio开发的 SDIO Wifi模块是基于SDIO接口的符合wifi无线网络标准的嵌入式模块 内置无线网络协议IEEE802 11协议栈以及TCP IP协议栈 能够实现用户
  • vue中根据某一个值的改变而动态改变样式

    最近有一个需求 动态改变宽度 缩小就变420px 放大宽度就应该占满整个屏幕 第一步 在div那里定义一个ref的值 第二步 计算屏幕的宽度 第三步 监听数的改变 从而改变样式 4 完美 收工
  • 42、Flutter之GridView组件详解

    GridView GridView可以构建一个二维网格列表 其默认构造函数定义如下 GridView Key key Axis scrollDirection Axis vertical bool reverse false ScrollC
  • 手机内存RAM、ROM简介

    手机内存包含两个 一个是运行内存 RAM 一个是机身内存 ROM 两者的功能有所不同 运行内存是对手机操作系统和其它程序运行过程中 产生的临时数据进行存储的媒介 如果手机运行的程序比较多 占用运行内存空间较大 会对手机运行速度产生影响 手机
  • 安装ise14.7时遇到的问题

    安装软件我踩过不少坑 这就分享给大家 也当做自己一个记录 省的又花大量时间找解决方法 1 打开ise跳出如下警告并无法打开ise使用 警告VC 2008runtime libraries are not inastalled 翻译成中文 未
  • Unity移动端Input---触控

    void Update Input GetKeyDown KeyCode Space Input GetAxis Horizontal 按左 右箭头或A D键 Input GetAxis Vertical 按上 下箭头或w s键 Input
  • Selenium 官网打不开怎么办?

    Selenium 官网打不开怎么办 刚接触Selenium的时候发现官网打不开 很是奇怪 我以为网站挂了 后来才知道这个网站也被屏蔽了 那就不上了呗 可是学习资料哪里找 我找了一下 github啊 selenium在github上开源 上面
  • 单链表实现(C++)

    C 实现单链表数据结构 myList h ifndef MYLIST H define MYLIST H typedef struct node int data struct node next Node class myList pub
  • 使用Sequelize模块操作数据库之增删改查

    前面我们已经了解了Sequelize中模型的创建 现在我们去了解一下通过 Sequelize 对数据库进行增删改查操作 在操作数据库时 增删改操作比较简单 我们会侧重去讲解查询数据库 简单 INSERT 语句 添加语句是通过Model cr
  • 牛客小白月赛61 F.选座椅(双指针)

    牛客小白月赛61 F 选座椅 双指针 显然 l r l r l r 满足 l
  • OpenAI-ChatGPT最新官方接口《嵌入向量式文本转换》全网最详细中英文实用指南和教程,助你零基础快速轻松掌握全新技术(五)(附源码)

    Embeddings 嵌入向量式文本转换 前言 Overview 概述 What are embeddings 什么是嵌入 How to get embeddings 如何获取嵌入 python代码示例 cURL代码示例 Embedding
  • Jenkins通过kubernetes plugin连接K8s集群

    一 Jenkins安装kubernetes plugin插件 1 1 点击左侧系统管理 1 2 点击插件管理 1 3 安装插件Kubernetes plugin 1 4 安装好后重启Jenkins 浏览器输入http 192 168 0 1
  • 嵌入式硬件系统的基本组成

    嵌入式硬件系统的基本组成 嵌入式系统的硬件是以包含嵌入式微处理器的SOC为核心 主要由SOC 总线 存储器 输入 输出接口和设备组成 嵌入式微处理器 每个嵌入式系统至少包含一个嵌入式微处理器 嵌入式微处理器体系结构可采用冯 诺依曼 Von
  • Jmeter@场景负载加压

    目录 性能测试Jmeter 常用的主流场景 场景一 Thread Group 场景二 jp gc Stepping Thread Group 场景三 jp gc Ultimate Thread Group 场景四 bzm Concurren
  • 吴博:京东应用架构设计与治理

    吴博 京东应用架构设计与治理 经过十年的业务快速发展 京东信息系统复杂度越来越高 一般电商系统只需关心 进销存 中的 销 京东系统需要管理采购 进 销售 销 和库存 存 三个环节 系统做水平垂直拆分后 需要解决系统间如何解藕 如何保证高效通
  • python 基于异步的编程

    背景 除了顺序执行和并行执行的模型之外 还有第三种模型 叫做异步模型 这是事件驱动模型的基础 异步活动的执行模型可以只有一个单一的主控制流 能在单核心系统和多核心系统中运行 在并发执行的异步模型中 许多任务被穿插在同一时间线上 所有的任务都