如何使用asyncio for basic file I

2024-09-29 23:19:40 发布

您现在位置:Python中文网/ 问答频道 /正文

基本上,我目前正在做以下工作:

for bigLogFile in bigLogFileFolder:
    with open(bigLogFile) as bigLog:
        processBigLogfile(bigLog)

由于我从网络驱动器加载此日志文件,所以执行时间的最大部分是等待文件加载。然而,processBigLogFile的执行时间也不是很简单。在

所以我的基本想法是让进程异步,允许程序在处理当前日志的同时加载下一个日志文件。 看起来很简单,但是我对异步编程没有任何经验,而且asyncio似乎提供了很多不同的方法来实现我想做的事情(使用Task或Future似乎是可能的选择)。在

有人能告诉我最简单的方法吗?Asyncio不是严格必需的,但我强烈希望使用内置库

应该注意的是,日志文件必须按顺序处理,所以我不能简单地并行加载和处理文件


Tags: 文件方法in网络foraswith时间
2条回答

听起来你希望文件打开是并行的,但处理是顺序的。我不确定这是否能节省你的时间。在

from concurrent.futures import ThreadPoolExecutor, as_completed

bigLogFileFolder = [...]

num = len(bigLogFileFolder)

pool = ThreadPoolExecutor(num)

futures = [pool.submit(open, bigLogFile) for bigLogFile in bigLogFileFolder]

for x in as_completed(futures):
    processBigLogFile(x.result())

如果使用简单的ThreadPoolExecutor可以实现同样的效果,则不需要复杂的异步编码:

from concurrent.futures import ThreadPoolExecutor

with ThreadPoolExecutor(max_workers=1) as tp:
    for bigLogFile in bigLogFileFolder:
        with open(bigLogFile) as bigLog:
            data = bigLog.read()
            tp.submit(process_data, data)

由于ThreadPoolExecutor在幕后使用一个队列,所以处理顺序将保留到max_workers=1的时间。在

另外,如果你有足够的内存来保存所有/大多数文件,它也能正常工作。如果是内存受限的,则必须等待ThreadPoolExecutor完成一些任务。在

相关问题 更多 >

    热门问题