使用asyncio上传使用可恢复上传链接的文件列表时没有加速



我有一个文件路径列表和它们上传到GCS桶的可恢复上传链接。我在正常情况下实现了这一点,然后使用asyncio,并没有发现执行速度的改进。如有任何建议,请指教。

from asyncio import run, gather
import requests 
async def uploadFile(UPLOAD_URL, LOCAL_PATH):
with open(LOCAL_PATH, 'rb') as f:
data = f.read()
requests.put(UPLOAD_URL, data=data)
async def uploadFiles(path_and_url):
uploads = [uploadFile(dic['upload_url'], dic['local_path']) for dic in path_and_url]
await gather(*uploads)
run(uploadFiles(path_and_url))

uploadFile选项中使用异步函数可以加快我的代码速度约15%,我还能做些什么?谢谢!

import aiohttp, aiofiles
async def uploadFile(UPLOAD_URL, LOCAL_PATH):
async with aiofiles.open(LOCAL_PATH, 'rb') as f:
data = await f.read()
# httpx.put(UPLOAD_URL, data=data)
async with aiohttp.ClientSession() as session:
async with session.put(UPLOAD_URL, data=data) as resp:
print(f"{LOCAL_PATH} -> {resp}")
async def uploadFiles(path_and_url):
uploads = [uploadFile(dic['upload_url'], dic['local_path']) for dic in path_and_url]
await gather(*uploads)

你所做的一切都没有错,我做了一些优化,它也可以加快你的代码。你在每次文件上传时都创建一个新的会话,这不是最优的,比创建一次并对所有请求使用它要花费更多的时间和资源。

import asyncio
import aiofiles
import aiohttp

async def upload_file(session, upload_url, local_path):
async with aiofiles.open(local_path, 'rb') as fp:
file_content = await fp.read()
response = session.put(upload_url, data=file_content)

async def upload_files(paths):
async with aiohttp.ClientSession() as session:
await asyncio.gather(*[upload_file(session, **path) for path in paths])

async def main():
await upload_files([
{'upload_url': 'https://.../', 'local_path': '/home/suraj/Downloads/1.png'},
{'upload_url': 'https://.../', 'local_path': '/home/suraj/Downloads/2.png'},
{'upload_url': 'https://.../', 'local_path': '/home/suraj/Downloads/3.png'},
{'upload_url': 'https://.../', 'local_path': '/home/suraj/Downloads/4.png'},
])

if __name__ == "__main__":
loop = asyncio.get_event_loop()
loop.run_until_complete(main())

最新更新