请教一个异步 asyncio 的问题

2018-12-02 19:46:44 +08:00
 meowoo

想写一个分析日志的工具,用 asyncio 处理的时候,想大家帮忙看一下哪里有问题,实际处理日志的时候,readlines 的时候,一个 650m 的文件需要 3 秒多,然后往字典里面加的时候需要 8 秒多,所以一个文件要 12 秒多,

现在的效果是,多个文件消耗的时间就是 12*n,就是说并没有提升,不是说 await 的时候,会把当前执行的内容挂起,然后执行下一个任务么,可能是我哪里有问题,麻烦大家给看看,代码如下。

import asyncio

import re

import time

from pathlib import Path

ip_find = re.compile(r'((25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d))).){3}(25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))')

ip_database = dict()

async def ip_address(log):

    """分析 ip"""
    with open(log) as f:
        log_data = f.readlines()
        try:
            for log_ips in log_data:
                ip_search = ip_find.search(log_ips)
                if ip_search:
                    ip_database[ip_search.group(0)] = ip_database.get(ip_search.group(0), 0) + 1
        except Exception as e:
            print(e)

async def generator(log):

    await ip_address(log)

if __name__ == '__main__':

    path = Path(r"D:\anlysis_log")
    start = time()

    loop = asyncio.get_event_loop()
    tasks = [generator(x) for x in path.iterdir()]
    loop.run_until_complete(asyncio.wait(tasks))
    loop.close()
2825 次点击
所在节点    Python
21 条回复
meowoo
2018-12-05 13:46:58 +08:00
@congeec 好的我仔细看下 第一次用 有点儿懵

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/513596

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX