CPU密集的高效访问和数据安全

2024-03-24 20:20

本文主要是介绍CPU密集的高效访问和数据安全,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

import asyncio
import concurrent.futures
import random

# 全局变量,用于存储计算结果的列表
list1 = []
list2 = []
lock = asyncio.Lock()  # 异步锁

# CPU计算密集型任务
async def cpu_intensive_task():
    global list1, list2

    # 获取异步锁
    async with lock:
        # 进行CPU计算密集型任务,这里简单地生成随机数并添加到列表中
        random_number = random.randint(1, 100)
        list1.append(random_number)
        list2.append(random_number * 2)

# 读取协程函数
async def reader_coroutine():
    global list1, list2

    while True:
        # 获取异步锁
        async with lock:
            # 读取列表1和列表2的值
            print(f"List 1: {list1}")
            print(f"List 2: {list2}")
        await asyncio.sleep(1)  # 每隔1秒读取一次

# 创建事件循环对象
loop = asyncio.get_event_loop()

# 创建多个读取协程并添加到事件循环中
readers = [reader_coroutine() for _ in range(5)]  # 创建5个读取协程

# 同时执行CPU计算密集型任务和读取协程
tasks = [cpu_intensive_task(), *readers]
loop.run_until_complete(asyncio.gather(*tasks))

# 关闭事件循环
loop.close()

上面的cpu_intensive_task 函数是CPU密集型,里面没有await和IO操作,就只有这个函数里修改两个全局变量list1和list2,其他协程函数都是读取。根据我们上面的总结,也就是我们可以不用加锁,也不会导致其他协程任务读到的数据两个全局变量list1和list2的数据不一致问题吗?

是的,根据我们之前的讨论和总结,如果 cpu_intensive_task 函数是一个纯粹的 CPU 密集型任务,没有涉及到 IO 操作或者 await 表达式,而且只是修改两个全局变量 list1list2,那么在这种情况下,可以不用加锁。

因为在 Python 中的 GIL(全局解释器锁)机制下,对于 CPU 密集型任务,即使有多个线程或者协程在执行,它们也无法同时访问同一个 CPU 核心,因此不会出现多个协程同时修改全局变量导致数据不一致的问题。

所以,在你的情况下,cpu_intensive_task 函数只是修改两个全局变量 list1list2,而其他协程函数只是读取这两个全局变量的值,因此不需要加锁也不会导致数据不一致的问题

那如果cpu_intensive_task 这个异步函数里有一部分存在读取文件,但是这个函数里面都没有使用await关键字或者有await关键字但await不会出现在修改两个全局变量list1和list2的中间位置,还是可以不用加锁吗?

在你描述的情况下,即使 cpu_intensive_task 函数中包含了一部分读取文件的操作,但没有使用 await 关键字或者 await 关键字不会出现在修改全局变量 list1list2 的中间位置,依然可以不用加锁。

异步编程中,如果一个协程内部有 IO 操作,但是这些 IO 操作不是通过 await 关键字等待的话,不会触发协程的挂起,也不会引起事件循环的切换。因此,只有涉及到 await 表达式才会触发挂起和事件循环的切换。

所以,在你的情况下,即使 cpu_intensive_task 函数中包含了一部分读取文件的操作,只要这些 IO 操作没有使用 await 等待,并且 await 关键字不会出现在修改全局变量 list1list2 的中间位置,依然可以不用加锁。

上面的cpu_intensive_task 这个异步函数里面await关键字 如果等待的是一个计算密集型任务,CPU在执行到这个await时不会让渡出CPU资源,只会阻塞等待任务的执行然后继续执行下面的代码吗?

对于异步函数中使用 await 关键字等待的是一个计算密集型任务,情况会有些不同。Python 中的异步机制实际上是基于事件循环的协作式调度,当遇到 await 表达式时,如果等待的是一个计算密集型任务(例如在同一个线程内的一些 CPU 密集型操作),那么 await 表达式会阻塞当前协程并暂时放弃 CPU 控制权,而不是等待任务的执行然后继续执行下面的代码。

这是因为在 Python 中,GIL(全局解释器锁)的存在导致了对于 CPU 密集型任务的并行执行无法真正实现。当一个协程遇到 await 表达式等待一个 CPU 密集型任务时,事件循环实际上会挂起这个协程,然后切换到其他就绪状态的协程执行。这样可以在遇到长时间的 CPU 计算时,避免整个事件循环被阻塞,提高了程序的并发性能。

所以,总的来说,异步函数中 await 关键字等待的是一个计算密集型任务时,不会让出 CPU 资源,而是暂时放弃 CPU 控制权,让事件循环调度其他协程执行,然后等待任务完成后再继续执行下面的代码。

也就是CPU遇到await关键字不管后面是否是CPU密集型任务还是IO任务都会暂时放弃当前任务的控制权,转而执行其他待续任务,而当执行awai后面的CPU密集任务时,CPU并不会任意切换到其他任务中?

是的,你的理解基本上是正确的。

在 Python 中,遇到 await 关键字时,不管后面是 CPU 密集型任务还是 IO 密集型任务,当前协程都会暂时放弃 CPU 控制权,转而执行其他待续任务,让事件循环调度其他协程执行。这是异步编程中的协作式调度机制,目的是避免阻塞整个事件循环。

当执行到 await 后面的 CPU 密集型任务时,因为 Python 中的 GIL(全局解释器锁)的存在,任务并不会真正实现并行执行,而是仍然在单个 CPU 核心上执行。但是由于事件循环的调度机制,当前协程会暂时放弃 CPU 控制权,让事件循环调度其他协程执行。这样可以避免一个长时间的 CPU 密集型任务阻塞整个事件循环,提高了程序的并发性能。

You

你的意思是当执行到 await 后面的 CPU 密集型任务里面时,CPU随时都可能让渡出计算资源转而执行其他任务里的代码?

不完全正确。在 Python 中,对于 CPU 密集型任务,当执行到 await 后面的 CPU 密集型任务时,CPU 不会随时让渡出计算资源转而执行其他任务里的代码。在单个线程内,CPU 密集型任务的执行会一直占用 CPU 资源,直到任务执行完成才会继续执行其他任务。

具体来说,当一个协程遇到 await 表达式等待一个 CPU 密集型任务时,该协程会暂时挂起,让出 CPU 控制权,但并不会让渡出计算资源,因为 Python 中的 GIL(全局解释器锁)的存在导致在单个线程内只能有一个线程执行 Python 字节码。因此,即使事件循环切换到其他协程,CPU 仍然会继续执行当前 CPU 密集型任务,直到任务执行完成或者遇到 IO 操作或者 await 关键字等待其他协程。

总之,CPU 密集型任务的执行不会随时让渡出计算资源转而执行其他任务里的代码,而是会一直执行直到完成或者遇到挂起条件。异步编程中的优势主要体现在 IO 密集型任务的异步执行上,对于 CPU 密集型任务,异步编程并不能提升性能。

这篇关于CPU密集的高效访问和数据安全的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/842675

相关文章

关于Java内存访问重排序的研究

《关于Java内存访问重排序的研究》文章主要介绍了重排序现象及其在多线程编程中的影响,包括内存可见性问题和Java内存模型中对重排序的规则... 目录什么是重排序重排序图解重排序实验as-if-serial语义内存访问重排序与内存可见性内存访问重排序与Java内存模型重排序示意表内存屏障内存屏障示意表Int

SpringBoot实现基于URL和IP的访问频率限制

《SpringBoot实现基于URL和IP的访问频率限制》在现代Web应用中,接口被恶意刷新或暴力请求是一种常见的攻击手段,为了保护系统资源,需要对接口的访问频率进行限制,下面我们就来看看如何使用... 目录1. 引言2. 项目依赖3. 配置 Redis4. 创建拦截器5. 注册拦截器6. 创建控制器8.

SpringBoot如何访问jsp页面

《SpringBoot如何访问jsp页面》本文介绍了如何在SpringBoot项目中进行Web开发,包括创建项目、配置文件、添加依赖、控制层修改、测试效果以及在IDEA中进行配置的详细步骤... 目录SpringBoot如何访问JSP页python面简介实现步骤1. 首先创建的项目一定要是web项目2. 在

Linux限制ip访问的解决方案

《Linux限制ip访问的解决方案》为了修复安全扫描中发现的漏洞,我们需要对某些服务设置访问限制,具体来说,就是要确保只有指定的内部IP地址能够访问这些服务,所以本文给大家介绍了Linux限制ip访问... 目录背景:解决方案:使用Firewalld防火墙规则验证方法深度了解防火墙逻辑应用场景与扩展背景:

使用Python检查CPU型号并弹出警告信息

《使用Python检查CPU型号并弹出警告信息》本教程将指导你如何编写一个Python程序,该程序能够在启动时检查计算机的CPU型号,如果检测到CPU型号包含“I3”,则会弹出一个警告窗口,感兴趣的小... 目录教程目标方法一所需库步骤一:安装所需库步骤二:编写python程序步骤三:运行程序注意事项方法二

Python使用pysmb库访问Windows共享文件夹的详细教程

《Python使用pysmb库访问Windows共享文件夹的详细教程》本教程旨在帮助您使用pysmb库,通过SMB(ServerMessageBlock)协议,轻松连接到Windows共享文件夹,并列... 目录前置条件步骤一:导入必要的模块步骤二:配置连接参数步骤三:实例化SMB连接对象并尝试连接步骤四:

高效+灵活,万博智云全球发布AWS无代理跨云容灾方案!

摘要 近日,万博智云推出了基于AWS的无代理跨云容灾解决方案,并与拉丁美洲,中东,亚洲的合作伙伴面向全球开展了联合发布。这一方案以AWS应用环境为基础,将HyperBDR平台的高效、灵活和成本效益优势与无代理功能相结合,为全球企业带来实现了更便捷、经济的数据保护。 一、全球联合发布 9月2日,万博智云CEO Michael Wong在线上平台发布AWS无代理跨云容灾解决方案的阐述视频,介绍了

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

高效录音转文字:2024年四大工具精选!

在快节奏的工作生活中,能够快速将录音转换成文字是一项非常实用的能力。特别是在需要记录会议纪要、讲座内容或者是采访素材的时候,一款优秀的在线录音转文字工具能派上大用场。以下推荐几个好用的录音转文字工具! 365在线转文字 直达链接:https://www.pdf365.cn/ 365在线转文字是一款提供在线录音转文字服务的工具,它以其高效、便捷的特点受到用户的青睐。用户无需下载安装任何软件,只

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问