python 多线程/async 读/写文件

Python3.7中用异步模式操作文件的方法,async file io Python3.5+中用异步模式操作文件的方法,async file io线程开启文件读取异步模式使用已编写好的第三方插件-aiofiles,支持异步模式插件可支持的属性参考: 平常使用的file操作模式为同步,并且为线程阻塞。当程序I/O并发次数高的时候,CPU被阻塞,形成闲置。现在我总结下目前python3.6以后的异步使用文件解决方案: 线程开启文件读取异步模式 1、用线程(Thread)方... 阅读详情

IO操作会造成程序阻塞耗时,因此采用 QUEUE + 多线程方式让IO操作不再阻塞主程序的运行,这样可以减少主程序的等待时间


from concurrent.futures import ThreadPoolExecutor
import time
import threading

data_queue=[]  # event_id: [data]   | event_id: [data1, data2, ... ]

def call_write_data(data):
    print('push writer data to queue')
    print('call writer process to write data' + str(data))
    queue_done = push2queue(data)
    print('pushed to queue done: ' + queue_done)

def push2queue(data):
    data_queue.append(data)
    return 'OK. write done: ' + str(data)


def do_call_internal(seconds_internal=5):
    for i in range (10):
        call_write_data(i)
        time.sleep(seconds_internal)

    time.sleep(100)
    for i in range(20,25):
        call_write_data(i)
        time.sleep(seconds_internal)


def do_writer():
    print('start to do writer')
    while True:
        while len(data_queue) > 0:
            print('this is to write data : ' + str(data_queue[0]))
            print(data_queue)
            time.sleep(6)
            data_queue.pop(0)
            print('write done')
            print(data_queue)

        while len(data_queue) <= 0:
            print('no data in queue, will sleep 3 seconds . . . ')
            time.sleep(3)


def binary_main():
    # for i in range(5):
    #     call_write_function(i)
    #     t_writer = threading.Thread(target=do_writer)
    #     print(t_writer.name)
    #     t_writer.start()
    #     print(threading.active_count())
    #     t_writer.join()

    # t_push = threading.Thread(target=call_write_function, args = (10,))
    t_push = threading.Thread(target=do_call_internal, args = (3,))
    t_writer = threading.Thread(target=do_writer)

    print(t_push.name)
    print(t_writer.name)
    t_push.start()
    t_writer.start()
    print(threading.active_count())
    t_push.join()
    t_writer.join()

binary_main()

将所有的要读的、要写的文件放到task list中,这样所有文件的读写都是异步的,速度比较快 


async def grpc_interface(opt_type, source_file, target_dir = './logs'):
    if opt_type =='read':
        print('read file ' + source_file)
        await do_read(source_file)
        print('done read file ' + source_file)
    else:
        print('write file ' + source_file)
        await do_write(source_file, target_dir)
        print('done write file ' + source_file)

    return

async def do_read(file):
    with open(file, 'rb') as fr:
        content = fr.read()
        await asyncio.sleep(5)
    return

async def do_write(source_file, target_dir):
    with open(source_file,'rb') as fr:
        content = fr.read()

    with open(os.path.join(target_dir, 'test.writer'), 'wb') as fw:
        fw.write(content)
        await asyncio.sleep(10)

    return

source_dir ='/home/lc/视频/dup_sub'
files = os.listdir(source_dir)
ioloop = asyncio.get_event_loop()

# tasks中也可以使用asyncio.ensure_future(gr1())..
tasks = [
    # grpc_interface('read', os.path.join(source_dir, file)) for file in files
    asyncio.ensure_future(grpc_interface('read', os.path.join(source_dir, file))) for file in files
]
tasks.extend([asyncio.ensure_future(grpc_interface('write', os.path.join(source_dir,file))) for file in files])
ioloop.run_until_complete(asyncio.wait(tasks))
ioloop.close()

读写folder: 只是读folder 和 写 folder是异步,读folder内的文件 和 写folder内的文件 是单线程,非异步,因此较上一种肉眼可见的慢



async def grpc_interface(opt_type, source_dir, target_dir = './logs'):
    if opt_type =='read':
        await do_read(source_dir)
    else:
        await do_write(source_dir, target_dir)
    return

async def do_read(file_dir):
    files = os.listdir(file_dir)
    for file in files:
        print('read file ' + file)
        with open(os.path.join(file_dir, file), 'rb') as fr:
            content = fr.read()
            await asyncio.sleep(5)
        print('done read file ' + file)
    return

async def do_write(source_dir, target_dir):
    files = os.listdir(source_dir)
    with open(os.path.join(target_dir, 'test.writer'), 'wb') as fw:
        for file in files:
            print('write file' + file)
            with open(os.path.join(source_dir, file), 'rb') as fr:
                content = fr.read()
                fw.write(content)
                await asyncio.sleep(10)
        print('done write file ' + file)
    return

source_dir ='/home/lc/视频/dup_sub'
files = os.listdir(source_dir)
ioloop = asyncio.get_event_loop()

# tasks中也可以使用asyncio.ensure_future(gr1())..
tasks = [
    # grpc_interface('read', os.path.join(source_dir, file)) for file in files
    asyncio.ensure_future(grpc_interface('read', source_dir)),
    asyncio.ensure_future(grpc_interface('write', source_dir))
]
ioloop.run_until_complete(asyncio.wait(tasks))
ioloop.close()

Swift 6、TypeScript 和 Python 的 async/await 机制异同 TypeScript 和 Python 类似,事件循环驱动, excels 在 web/I/O,但 CPU 时需小心阻塞。Async/await 是一种编程模式,用于处理异步操作(如网络请求、文件读写或延时任务),让代码看起来像同步代码一样线性易读,同时避免阻塞程序的执行流。TypeScript 是 JavaScript 的超集,它的 async/await 直接基于 JS(EcmaScript 2017 引入)。这些 Demo 展示:三者都能并发执行,总时间短(非 5s),证明非阻塞和并发益处。 阅读详情

相关推荐

解密 Python 异步编程:深入了解 async/await

async标记函数为异步函数,返回协程对象await暂停执行,等待其他异步操作完成异步编程适合 I/O 密集型任务,不适合 CPU 密集型任务需要搭配asyncio等库使用本质上是协作式多任务,而非并行执行Python 的 async/await 让我们能够写出高效的非阻塞代码,但无需处理传统的回调地狱问题,代码逻辑保持清晰易读。

AI Agent 首席体验官 875

python使用多线程写入数据到文件

python使用多线程写入数据时,可能会存在写入的一些数据丢失现象。如示例代码1所示,反复修改写入文件的两种方式和加入buffering缓冲也时存在数据丢失现象。百度众多帖子也未找到答案,最后加入了锁机制,竟然解决了数据丢失的问题!各位大佬若有好的办法,欢迎评论区留言......

IT之一小佬的博客 7542

python中async/await异步功能是什么,有什么用?

我们经常可能在某些库中看到async/await的使用,例如,aiohttp,fastapi等,那么,他们为什么要这样做呢?详细的使用方法又是怎么样的?本文将介绍async/await的使用。

这是仙草哥哥的博客 925

python使用asyncio实现异步文件操作

异步 IO 适用于 IO 密集型任务,对于 CPU 密集型任务,异步 IO 并不能带来显著的性能提升。理解和编写异步代码需要一定的学习成本,需要掌握。

m0_37570494的博客 2018

Python中使用asyncio 封装文件读写

本文主要给大家简单讲解如何用 asyncio.Future 对象来封装文件的异步读写。有需要的小伙伴可以参考下

Labwindows CVI写上位机与STM32下位机通信(二)

接着上篇,这篇主要谈谈流量计数据读取。我们使用的MEMS流量计采用Modbus协议Modbus 使用RS-485 作为硬件载体。 一. Modbus协议   该协议定义了 Modbus 总线Master(主设备)与Slave(从设备)之间的通讯报文格式,对于主设备来说,Modbus 协议是联系上位机(如PC、PLC、HMI 等)的接口,而且所有的通讯都是“透明的”。控制器通信使用主-从技术,即

yang2011079080010的专栏 1万+

python中的封装调用_Python中使用asyncio 封装文件读写

前言和网络 IO 一样,文件读写同样是一个费事的操作。默认情况下,Python 使用的是系统的阻塞读写。这意味着在 asyncio 中如果调用了12f= file('xx')f.read()会阻塞事件循环。本篇简述如何用 asyncio.Future 对象来封装文件的异步读写。代码在 GitHub。目前仅支持 Linux。阻塞和非阻塞首先需要将文件的读写改为非阻塞的形式。在非阻塞情况下,每次调用 ...

weixin_39599654的博客 468

LangChain Message 官方文档

消息是聊天模型中的基本通信单位。它们用于表示聊天模型的输入和输出,以及与对话相关的其他上下文或元数据。每条消息都包含一个角色(如“用户”、“助手”)和内容(如文本或多模态数据),并可能包含根据不同聊天模型提供商而有所不同的附加元数据。LangChain 提供了一个统一的消息格式,可以跨不同聊天模型使用,简化用户在不同模型之间切换时所需关注的消息格式差异。

AI Agent 首席体验官 896

python使用多线程读写数据到文件2

python使用多线程读写数据到文件2

IT之一小佬的博客 3843

自建 HTML获取腾讯六宫格点选图片验证码素材,实现刷新批量获取图片方便训练

通过自建 HTML 页面,可以方便地获取腾讯六宫格二维码素材,不仅过程简单,而且可以灵活配置各种参数。希望这篇文章能帮助到需要相关素材的小伙伴。如果你有其他问题或者更好的方法,欢迎留言交流!

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 483

RK3568平台开发系列讲解:内核启动流程

第 493 行的 ENTRY 指明了了 Linux 内核入口,入口为stext,stext 定义在文件arch/arm/kernel/head.S 中 , 因此要分析Linux 内核的启动流程,就得先从文件arch/arm/kernel/head.S 的 stext 处开始分析。_mmap_switched 定义在文件 arch/arm/kernel/head-common.S,__mmap_switched 最终会调用 start_kernel 函数。⑥、r2=atags 或者设备树(dtb)首地址。

内核笔记 216

Python中 async/await 和传统多线程的区别?

摘要:async/await和多线程是两种并发处理方式,本质差异在于调度机制不同。多线程通过操作系统线程切换实现并发,适合处理IO与CPU混合任务;async/await基于事件循环,在单线程中通过任务切换实现高并发IO处理,但要求全链路异步。选择依据:高并发IO场景用异步,需兼容阻塞库或少量计算的用多线程。两者都存在调试困难问题,且都不适合CPU密集型任务。正确理解两种模式的适用场景和局限性,是技术选型的关键。

程序员学习园地。 875

Labview界面多按钮控件的一种处理方法

当界面中存在多个按钮控件时候,此时如果逐个为每个控件添加事件条件则会显得较为麻烦,此处提供了一种对多控件进行批量处理的方法

miracleis的博客 2702

Python与多进程、多线程——multiprocessing、threading、async/await

1、multiprocessing模块 1)使用进程池pool: pool( )类:指定进程池中同时执行的进程数为8,当一个进程执行完毕后,如果还有新进程等待执行,则会将其添加进去。 pool.apply_async( ):为非阻塞,即不用等待当前运行的子进程执行完毕(各子进程并行执行,且主进程与子进程之间、各子进程之间都不会互相等待),随时根据系统调度来进行进程切换。 pool.apply( ):阻塞型,各子进程需依次执行,主进程会被阻塞直到函数执行结束 【多进程执行过程中,子进程出错时,将直接跳出,执

lucky_chaichai的博客 2151

从战略到执行:业务领先模型 BLM 的第一把钥匙「差距分析」

业务领先模型「BLM」(Business Leadership Model),俗称“别乱摸”,起源于哈佛商学院的战略理论研究,是一套完整的战略规划方法论。 后来被 IBM 发扬光大,IBM 在转型关键时期完成了对 BLM 模型的导入和创新,从此这个模型成为 IBM 中高层用于战略制定与执行联接的方法与平台。 再到后来华为花巨资引入了 BLM 模型,经过多年的应用,将其演化成了公司战略规划和落地的主要方法与流程,也因此被中国科技企业所认识和接受。 BLM 模型可以解决哪些问题? 在企业内,

产品线负责人 2400

YOLOv11改进 | 特殊场景检测篇 | 利用图像去雾网络UnfogNet改进yolov11图像雾天检测能力(全网独家首发改进)

本文给大家带来的改进机制是利用UnfogNet超轻量化图像去雾网络,我将该网络结合YOLOv11针对图像进行去雾检测(也适用于一些模糊场景),我将该网络结构和YOLOv11的网络进行结合同时该网络的结构的参数量非常的小,我们将其添加到模型里增加的计算量和参数量基本可以忽略不计这是非常难得的,因为其也算是一种图像增强算法,同时本文的内容不影响其它的模块改进可以作为工作量凑近大家的论文里,非常的适用,图像去雾检测为群友最近提出的需要的改进。欢迎大家订阅我的专栏一起学习YOLO!

Snu77的博客 1628

async python两个_python多线程

为了提高程序并行运行的效率,我们会采取多进程和多线程的方法。通常来说,多进程适用于计算密集型任务,多线程适用于IO密集型任务,如网络爬虫。关于多线程和多进程的区别,请参考这个表格。参考资料: 多线程和多进程的区别下面将使用python标准库的multiprocessing包来尝试多线程的操作,在python中调用多线程要使用multiprocessing.dummy,如果是多进程则去掉dummy即...

weixin_42315569的博客 406

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

python 协程 async/await

1、前言 1.1 计算密集型、IO密集型 python因为自身的GIL的问题导致并发不能像java和C一样,但并不是说Python不能实现并发。常见的有两种: **- 计算密集型 IO密集型** 计算密集型 计算密集型任务的特点是要进行大量的计算,消耗CPU资源,比如计算圆周率、对视频进行高清解码等等,全靠CPU的运算能力。这种计算密集型任务虽然也可以用多任务完成,但是任务越多,花在任务切换的时间就越多,CPU执行任务的效率就越低,所以,要最高效地利用CPU,计算密集型任务同时进行的数量应当等于CPU的

止语的博客 8199

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Python 异步协程:asyncio、async/await、aiohttp

Windows GUI 主线程消息循环是典型。

freeking101的博客 4390

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Python 协程全解析:async/await、asyncio.run、协程 vs 多线程、I/O 密集首选协程

场景是否推荐协程网络请求(爬虫、API)✅ 强烈推荐数据库访问(async 驱动)✅ 推荐文件异步读写✅ 推荐高并发定时任务✅ 推荐CPU 密集型(图像处理等)❌ 不推荐,建议用多进程环境是否能用推荐方式普通 Python 脚本✅ 可以❌ 默认不行直接使用await或。

ningyanggege的博客 1536

Python的异步把我坑惨了,原来async/await和多线程的区别这么大

多线程是操作系统帮你切换任务,异步是你自己主动让出控制权。多线程:招了10个厨师,每个厨师负责一道菜。等菜的时候厨师闲着,但其他厨师还在忙异步:只有1个超级厨师,但他从来不等——菜在锅里炖的时候,他立刻去切下一道菜的食材现在我遇到并发需求,会先问自己两个问题:任务是等(I/O)还是算(CPU)?等的话才考虑并发并发量多大?几十个用多线程,几百上千个用异步想清楚再动手,少让程序卡住几次。

这家伙很懒,什么都没有留下 389

Python: 从async/await理解协程的高效世界

本文介绍了Python异步编程的核心概念与实践。通过图书馆的类比,解释了协程在单线程内高效切换任务的特点,特别适合IO密集型场景。对比了同步与异步的执行差异,并展示async/await语法实战,包括定义异步函数、执行单个/多个协程。文章还比较了协程与线程的优劣,分析了asyncio框架的事件循环、任务管理等核心机制。最后总结了异步编程的适用场景(网络请求、IO操作)与不适用场景(CPU密集型计算),帮助开发者合理选择并发方案。掌握异步编程可显著提升程序在IO密集型任务中的效率。

huachao1001的专栏 1051

python async

理解 python 的 async:1. 协程后面的技术也是 IO 多路复用, Nginx 和 nodejs 都充分利用了这种机制. 2. Flask 线程中为什么不能直接使用标准库 asyncio 来支持异步? asyncio 一定要有应该eventloop, 而这个 eventloop 必须运行在主线程, 不能运行在子线程中, 所以在Flask 线程中不能直接使用标准库 asyncio....

weixin_30883311的博客 2094

python3 async 实践

python3 async 实践 async/await 是python3的新特性,可以进行协程运行。个人将他理解成多线程。实现代码如下 #!/usr/bin/python3 # -*- coding: utf-8 -*- import time import asyncio async def SleepTime(ts): if ts == 3: await asyncio.sleep(10) #当ts等于3的时候,让挂起的时间为10s,其他的按正常挂起,验证协程时间。

qq_38495527的博客 6538

Python中的异步async

首先来看一下异步模型。在异步模型中,允许同一时间发生(处理)多个事件。程序调用一个耗时较长的功能(方法)时,它并不会阻塞程序的执行流程,程序会继续往下执行。当功能执行完毕时,程序能够获得执行完毕的消息或能够访问到执行的结果(如果有返回值或需要返回值时)。下面通过一个示例来看一下同步和异步的区别。示例中程序通过网络获取两个文件,并对两个文件进行合并处理:在异步系统当中的解决方案是开启一个额外的线程进行处理。

向着星辰大海 881
上一篇: 视频关键帧提取方法对比
下一篇: python thread VS async
令羽飞飞
博客等级 码龄14年 42粉丝 166原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值