Python之异步处理

2023-11-01

同步处理,也被称为是阻塞式处理,是指程序执行到某个位置,会一直等待该命令执行完毕,然后继续执行后续逻辑。
异步处理,是指一段程序由多个线程或进程同时执行,从而提高软件性能。

一、多线程

线程是计算机调度的基本单位,一个进程至少有一个线程。线程是轻量级的,线程的启动、调度对操作系统来说所耗资源较少,所以大多数软件都涉及了多个线程来并行执行程序,从而提高运行速度。线程的调度不是认为控制的,而是由操作系统决定的,创建多线程只是为一个软件争取更多被调度到的机会。

  1. 创建新线程
# -*- coding: UTF-8 -*-
import threading
import time

def get_data_from_db():
    print("当前线程名称:{0}".format(threading.current_thread().name))
    for i in range(5):
        time.sleep(1) # 表示“睡眠”一秒

    print("{0} 线程执行完毕!".format(threading.current_thread().name))


if __name__ == "__main__":# 用于对当前模块进行测试。如果是直接执行当前模块,则判断为True;如果该模块被导入其他模块中,则判断为False.
    print("{0} 线程开始运行".format(threading.current_thread().name))
    thread = threading.Thread(target=get_data_from_db, name="新线程")#threading.Thread()创建了一个线程实例
    thread.start()# 表示启动创建的新线程
    thread.join()# 是一个阻塞式方法,表示在当前位置等待新线程结束,之后在在主线程继续执行
    print("{0} 线程执行完毕!".format(threading.current_thread().name))
  1. 多个线程共享一个进程的内存空间,多个线程同时修改一个全局变量,始终都能正确输出,这称为线程安全。python使用“锁”机制来保证线程安全。如下所示:
# -*- coding: UTF-8 -*-

import time, threading

global_score = 100

lock = threading.Lock()


def update_score(score):
    for i in range(200000):
        lock.acquire() # 获取“锁”
        global global_score
        global_score = global_score + score
        global_score = global_score - score
        lock.release() # 释放“锁”

threads = []
for i in range(10):
    thread = threading.Thread(target=update_score, args=(i * 10,)) # 创建10个线程对象,每个线程负责执行各自的回调函数update_score
    threads.append(thread)

for i in threads:
    i.start() # 将线程全部启动,但10个线程不会同时执行,每个线程获取到锁,在对全局变量操作结束后释放锁,中间不会切换线程,这个过程是原子性的。

for i in threads:
    i.join()

print("global_score值:", global_score)

二、多进程

文件是静态的,进程是动态的。不同进程是独立运行的,拥有各自的内存空间、数据资源、文件资源等。一个进程可以创建另一个进程,称为当前进程的子进程。

  1. 创建子进程
    Linux中使用fork方法创建子进程。windows中使用multiprocessing.Process创建子进程,如下所示:
# -*- coding: UTF-8 -*-

import time
from multiprocessing import Process
import os

def new_process(para):
    time.sleep(10)
    print("子进程ID:{0}".format(os.getpid()))
    print("主进程传递来的参数:{0}".format(para))


if __name__ == "__main__":
    print("父进程ID是:{0}".format(os.getpid()))
    process = Process(target=new_process, args=("主进程参数",))
    process.start()# 启动进程
    process.join()# 等待子进程执行完毕,再执行主进程
    print("主进程执行完毕!")
  1. 进程池

当主进程需要同时管理多个进程的时候,可以使用进程池。如下所示:

# -*- coding: UTF-8 -*-

from multiprocessing import Pool
import time


def proc(num):
    print("当前进程编号:{0} 开始执行".format(num))
    time.sleep(5)
    print("当前进程编号:{0} 执行结束".format(num))


if __name__ == "__main__":
    pool = Pool(3) # 创建一个进程池对象,并且进程池中同时运行的进程个数为3个
    print("创建5个进程")
    for i in range(5):
        process_num = "{0}".format(i)
        pool.apply_async(proc, args=(process_num,)) # 用于创建进程
    pool.close()# 表示不能再有新的进程加入pool
    pool.join() 
    print("主进程执行完毕!")
  1. 进程间通信
    python使用多进程 multiprocessing 模块提供了进程间通信的工具:Queue。一个进程往Queue中放数据,另一个进程从Queue中取数据,由此实现通信,如下所示:
# -*- coding: UTF-8 -*-

from multiprocessing import Process, Queue
import os, time


def set_data(q, tmp_list):
    for item in tmp_list:
        print("当前{0}进程将值 {1} 插入队列".format(os.getpid(), item))
        q.put(item)
        time.sleep(2)


def get_data(q, count):
    for i in range(count):
        value = q.get(True)
        print("当前{0}进程获取到值为:{1}".format(os.getpid(), value))


if __name__ == "__main__":
    que = Queue()
    data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    length = len(data)
    process1 = Process(target=set_data, args=(que, data))
    process2 = Process(target=get_data, args=(que, length))
    process1.start()
    process2.start()
    process2.join()
    print("主进程执行完毕!")

其执行结果如图:
在这里插入图片描述
也可以参考之间的博文:Python使用socket实现两进程之间的传输数据

三、协程

Python提供了async关键字创建的异步函数,就是协程。异步函数的返回值并不是该函数的执行结果,而是一个协程对象,协程对象调用send方法才会触发异步函数的执行。如下所示:

# -*- coding: UTF-8 -*-
import time


async def get_data_from_db(counter):
    data = []
    print("参数counter:", counter)
    for i in range(counter):
        time.sleep(1)
        data.append(i)
    return data

coroutine_obj = get_data_from_db(5)
print("异步函数返回值:",coroutine_obj)
try:
    coroutine_obj.send(None)
except Exception as e:
    print(e)

参考:《python数据分析与大数据处理》

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python之异步处理 的相关文章

  • 如何更改默认的Python版本?

    我已经在我的 Mac 上安装了 Python 3 2 我跑完之后 Applications Python 3 2 Update Shell Profile command 当我输入时 这很令人困惑Python V在终端它说Python 2
  • Python Numpy Reshape错误[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我在尝试重塑 3D numpy 数组时遇到一个奇怪的错误 数组 x 的形状为 6 10 300 我想将其重塑为 6 3000 我正
  • 如何在seaborn热图标签中使用科学计数法?

    我正在尝试在 python 中使用seaborn 获取热图 不幸的是 即使数字非常大 它也没有使用科学记数法 我想知道是否有任何简单的方法可以转换为科学记数法或任何其他合理的格式 这是显示问题的一段代码 import seaborn as
  • Django 查询:“datetime + delta”作为表达式

    好吧 我的问题如下 假设我有下一个模型 这是一个简单的情况 class Period models Model name CharField field specs here start date DateTimeField field s
  • 如何调试 numpy 掩码

    这个问题与this one https stackoverflow com q 73672739 11004423 我有一个正在尝试矢量化的函数 这是原来的函数 def aspect good angle float planet1 goo
  • 如何在 numpy 数组中查找并保存重复的行?

    我有一个数组 例如 Array 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 1 1 1 2 2 2 我想要输出以下内容的东西 Repeated 1 1 1 2 2 2 保留重复行的数量也可以 例如 Repeated 1 1
  • 从字典中绘制直方图

    我创建了一个dictionary计算 a 中出现的次数list每个键的内容 我现在想绘制其内容的直方图 这是我想要绘制的字典的内容 1 27 34 1 3 72 4 62 5 33 6 36 7 20 8 12 9 9 10 6 11 5
  • 获取 int() 参数必须是字符串或数字,而不是“Column”- Apache Spark

    如果我使用以下代码 我会收到此异常 int argument must be a string or a number not Column df df withColumn FY F when df ID substr 5 2 isin
  • Karasuba算法递归过多

    我正在尝试用 c 实现 Karasuba 乘法算法 但现在我只是想让它在 python 中工作 这是我的代码 def mult x y b m if max x y lt b return x y bm pow b m x0 x bm x1
  • Pandas如何按时间段过滤DataFrame

    我有一个包含下表的文件 Name AvailableDate totalRemaining 0 X3321 2018 03 14 13 00 00 200 1 X3321 2018 03 14 14 00 00 200 2 X3321 20
  • Python:“直接”调用方法是否实例化对象?

    我是 Python 新手 在对我的对象进行单元测试时 我注意到一些 奇怪 的东西 class Ape object def init self print ooook def say self s print s def main Ape
  • 在 pygame 中,我如何创建一个数据结构来跟踪调整大小事件和对象的坐标?

    我希望在调整屏幕大小后使鼠标事件与对象保持同步 有人告诉我需要创建一个数据结构来跟踪 调整事件大小 新坐标以匹配调整大小 如何使用简单的代数方程来完成此操作并将其集成到调整大小事件中以进行准确更新 反过来做 创建一个虚拟游戏地图 在绘制场景
  • 将 Python Selenium 输出写入 Excel

    我编写了一个脚本来从在线网站上抓取产品信息 目标是将这些信息写入 Excel 文件 由于我的Python知识有限 我只知道如何在Powershell中使用Out file导出 但结果是每个产品的信息都打印在不同的行上 我希望每种产品都有一条
  • 我可以在 if 语句中使用“as”机制吗

    是否可以使用as in if类似的声明with我们使用的 例如 with open tmp foo r as ofile do something with ofile 这是我的代码 def my list rtrn lst True if
  • 如何全局安装 Python(开发)依赖项,以便我不必在每个 venv 中重新安装它们?

    我希望在为每个项目创建的每个 venv 虚拟环境 中都可以使用一些 Python 依赖项 例如 black flake8 和 pytest 这可能吗 如果可以 如何实现 我想安装这三个once在我的主要 Python 安装下 我必须在启动新
  • 更改用作函数全局作用域的字典

    我想做一个 purePython 的装饰器 其中一部分是能够有选择地禁止访问函数的全局范围 有没有一种方法可以以编程方式更改哪个字典事物充当函数的全局 外部作用域 因此 例如在下面我希望能够拦截对f in h并抛出错误 但我想允许访问g因为
  • 如何使用logging.conf文件使用RotatingFileHandler将所有内容记录到文件中?

    我正在尝试使用RotatingHandler用于 Python 中的日志记录目的 我将备份文件保留为 500 个 这意味着我猜它将创建最多 500 个文件 并且我设置的大小是 2000 字节 不确定建议的大小限制是多少 如果我运行下面的代码
  • 在不同的 GPU 上同时训练多个 keras/tensorflow 模型

    我想在 Jupyter Notebook 中同时在多个 GPU 上训练多个模型 我正在使用 4GPU 的节点上工作 我想将一个 GPU 分配给一个模型并同时训练 4 个不同的模型 现在 我通过 例如 为一台笔记本选择 GPU import
  • 使用 Numpy 进行多维批量图像卷积

    在图像处理和分类网络中 一个常见的任务是输入图像与一些固定滤波器的卷积或互相关 例如 在卷积神经网络 CNN 中 这是一种极其常见的操作 我已将通用版本任务减少为 Given 一批 N 个图像 N H W D 和一组 K 个滤镜 K H W
  • python 日志记录替代方案 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 蟒蛇记录模块 http docs python org library logging html使用起来

随机推荐

  • python怎么编写模拟交易_python简单区块链模拟详解

    最近学习了一点python 那就试着做一做简单的编程练习 首先是这个编程的指导图 如下 对的 类似一个简单区块链的模拟 代码如下 class DaDaBlockCoin index 索引 timestamp 时间戳 data 交易记录 se
  • [QT_000]学习Qt的最好途径(个人记录)

    00 先通过相关书籍 网上视频了解基础 可以通过某位大神的系列博客总结去学习 这样相对全面一些 达到最好能了解到整个Qt的全貌 不求甚解 01 当了解完基础以后 把Qt自带的案例例子运行一遍 搞懂案例 这是非常有用的一步 现实中好多小功能都
  • 数字水印技术的原理及应用研究

    一 问题分析 随着计算机和网络技术的普及 数字产品的保密性及版权保护等问题逐渐凸显出来 这使得数字水印技术成为热点问题 一些别有企图的个人和团体在没有得到原作者的同意的情况下复制和传播有版权的数据文件或作品 所以 数字媒体的信息安全 知识产
  • 【ARIMA-SSA-LSTM】合差分自回归移动平均方法-麻雀优化-长短期记忆神经网络研究(Python代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 1 1 ARIMA模型 1 2 鲸鱼优化算法 1 3 LSTM 模型 2 运行结果 3 参考文献 4 Py
  • 计算机网络 五、 五层协议体系结构-----网络层(上)

    网络层 network layer 主要包括以下两个任务 1 负责为分组交换网上的不同主机提供通信服务 在发送数据时 网络层把运输层产生的报文段或用户数据报封装成分组或包进行传送 在TCP IP体系中 由于网络层使用IP协议 因此分组也叫做
  • 了解chat-GPT必须要读的论文汇总

    前言 今年在nlp领域 最靓的仔要数chat gpt了 未来也可能颠覆搜索行业 甚至其他行业也会慢慢的被颠覆被取代 作为技术人员 为了保证饭碗 必须跟进相关技术的发展 目前梳理了一下chat gpt技术的脉络 通过该脉络可以比较系统的了解c
  • 开发uniapp苹果app,苹果签名证书的创建方法

    在uniapp云打包界面 打包苹果app 需要私钥证书p12文件 还需要证书profile文件和证书密码 这两个文件到底是从什么地方获取的呢 答案是这两个证书需要在苹果开发者中心生成 下面我们这篇教程 将教会大家如何创建这两个打包所需的证书
  • C语言基础(五)自定义类型与宏定义

    自定义类型与宏定义 一 自定义类型 二 宏定义 三 枚举 一 自定义类型 自定义类型 typedef用新的类型名代替原有的类型名 例如 指定用u8为类型名 作用与unsigned char相同 typedef unsigned char u
  • 自定义Dynamics 365实施和发布业务解决方案 - 7. 报表

    在每个组织中 决策者都依赖于各种报告来推动业务取得成功 因此 每个软件开发项目都需要开发报告 Dynamics365配备了最先进的报告功能 这些报告的范围从简单的查询到具有复杂查询的更高级的报告 此外 Dynamics365的一个关键功能是
  • Qt 串口发送0x00

    应用场景 大恒光电的平移台 GCD 040101M 先看看要发什么东西 这是串口监听软件截取的结果 绿色的字 串口协议主要包括三个部分 前面是固定的 后面是key 后面是 0x00 最后面是数据 错误版本1 bool MoveStage w
  • Windows10点击睡眠之后不锁屏?

    一些用户反馈自己在使用win10系统笔记本电脑过程中 突然碰到了无法睡眠的情况 不管是盖上屏幕还是在系统中选择睡眠 电脑都无法进行睡眠 根本没有任何反应 该怎么办呢 接下来 系统城小编就为大家带来该问题的具体解决方法 首先可以按方法一进行设
  • Deepin 系统安装并开启本地远程使Windos系统访问

    思路 1 系统安装 2 安装xrdp Linux和Windows间的远程桌面访问 coder i 的博客 CSDN博客 linux远程连接windows桌面 sudo apt install xrdp 然后启动xrdp服务 sudo sys
  • 关于stm32的GPIO的操作

    首先先了解一下输出的模式 比较常用的是 推挽输出 1 GPIO Mode AIN 模拟输入 2 GPIO Mode IN FLOATING 浮空输入 3 GPIO Mode IPD 下拉输入 4 GPIO Mode IPU 上拉输入 5 G
  • 字符流

    import java io FileNotFoundException import java io FileReader import java io FileWriter import java io IOException publ
  • 线性代数(17)——坐标转换

    坐标转换 空间的基与坐标系 任意坐标系与标准坐标系之间的转换 任意坐标系之间的转换 标准单位矩阵作为桥梁 结论验证 不使用单位坐标系为桥梁的情况 空间的基与坐标系 坐标系是理解空间的基的一个视角 如果只到了一个坐标系也相当于知道了空间中的一
  • 【axmol】基于Cocos2d-x 4.0的持续维护的游戏引擎介绍

    Axmol引擎 A Multi platform Engine for Desktop XBOX UWP and Mobile games A radical fork of Cocos2d x 4 0 Axmol是基于Cocos2d x
  • 【小程序】手动实现switch开关中带文字效果(开关左右文字相同/不同都可以)

    最终效果 左右文字宽度相同 左右文字宽度不同 左右长度相同 效果 配合wx show切换 注意 左右长度相同的话可以设置合适的相同的宽度 html
  • 五. go 常见数据结构实现原理之 string, iota

    目录 一 string 其它问题 二 iota 几个小问题 原理 一 string golang中对string的解释 8比特字节的集合 可以为空 长度为0 但不会是nil string对象不可以修改 查看string 数据结构 strin
  • C语言中的正则表达式:匹配和替换

    当你在C语言中需要进行字符串匹配和替换操作时 正则表达式是一个强大的工具 在C语言中 可以使用正则表达式库来处理正则表达式的匹配和替换操作 下面是一个使用C语言中的正则表达式的示例教程 首先 你需要包含适当的头文件 c include
  • Python之异步处理

    同步处理 也被称为是阻塞式处理 是指程序执行到某个位置 会一直等待该命令执行完毕 然后继续执行后续逻辑 异步处理 是指一段程序由多个线程或进程同时执行 从而提高软件性能 一 多线程 线程是计算机调度的基本单位 一个进程至少有一个线程 线程是