我有一个asyncio python azure脚本,它使用多个任务将文件从asyncio队列上传到blob。它工作得很好,至少在耗尽系统上所有可用内存之前是这样。我找不到内存泄漏的地方。通常我使用内存分析器,但这似乎不适用于异步函数。
有人能告诉我我做错了什么吗,或者找出问题所在的最好方法是什么?谢谢。如果有的话,我不清楚有什么东西没有被清理。
我将几百到几千个文件放在工作队列中,通常运行3-5个任务。在几分钟的时间内,这个程序会用完3到6 6GB的驻留内存,然后开始吞噬交换空间,直到它运行足够长的时间后,它会因内存匮乏而被杀死。这是在一个8 8GB内存的linux机器上,使用Python 3.6.8和以下azure库:
azure-通用1.1.25
azure-核心1.3.0
azure-identity 1.3.0
azure-nspkg 3.0.2
azure-存储-blob 12.3.0
from azure.identity.aio import ClientSecretCredential
from azure.storage.blob.aio import BlobClient
async def uploadBlobsTask(taskName, args, workQueue):
while not workQueue.empty():
fileName = await workQueue.get()
blobName = fileName.replace(args.sourceDirPrefix, '')
blobClient = BlobClient(
"https://{}.blob.core.windows.net".format(args.accountName),
credential = args.creds,
container_name = args.container,
blob_name = blobName,
)
async with blobClient:
args.logger.info("Task {}: uploading {} as {}".format(taskName, fileName, blobName))
try:
with open(fileName, "rb") as data:
await blobClient.upload_blob(data, overwrite=True)
fileNameMoved = fileName + '.moved'
with open(fileNameMoved, "w") as fm:
fm.write("")
except KeyboardInterrupt:
raise
except:
args.logger.error("Task {}: {}".format(taskName, traceback.format_exc()))
await workQueue.put(fileName)
finally:
workQueue.task_done()
async def processFiles(args):
workQueue = asyncio.Queue()
for (path, dirs, files) in os.walk(args.sourceDir):
for f in files:
fileName = os.path.join(path, f)
await workQueue.put(fileName)
creds = ClientSecretCredential(args.tenant, args.appId, args.password)
args.creds = creds
tasks = [ args.loop.create_task(uploadBlobsTask(str(i), args, workQueue)) for i in range(1, args.tasks+1) ]
await asyncio.gather(*tasks)
await creds.close()
loop = asyncio.get_event_loop()
args.loop = loop
loop.run_until_complete(processFiles(args))
loop.close()发布于 2020-04-10 00:27:21
不管它有什么价值,我似乎已经设法修复了这个问题,这样它就可以在没有内存泄漏的情况下工作。为此,我先获取了一个containerClient,然后从中获取了blobClients (即containerClient.get_blob_client()),而不是直接获取BlobClient对象。现在,总体内存使用量达到了一个非常低的水平,而不是像以前那样持续增长。
https://stackoverflow.com/questions/61109155
复制相似问题