想写一个分析日志的工具,用 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()
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.