Python 3.x Boto3:需要一个未来或协同程序
我正在尝试使用boto3从S3下载2个文件,并等待下载2个文件,然后将继续处理2个文件 我所做的Python 3.x Boto3:需要一个未来或协同程序,python-3.x,boto3,python-asyncio,Python 3.x,Boto3,Python Asyncio,我正在尝试使用boto3从S3下载2个文件,并等待下载2个文件,然后将继续处理2个文件 我所做的 async def download_files(): await client.download_file(const.bucket_name, 'file/name.txt', '/tmp/name.txt') print('file 1 downloaded') await client.download_file(const.bucket_name, 'file/cl
async def download_files():
await client.download_file(const.bucket_name, 'file/name.txt', '/tmp/name.txt')
print('file 1 downloaded')
await client.download_file(const.bucket_name, 'file/class.txt', '/tmp/class.txt')
print('file 2 downloaded')
return True
def main():
...
loop = asyncio.get_event_loop()
loop.run_until_complete(download_files())
loop.close()
...
main()
我收到一个错误
A Future or coroutine is required
这是我第一次使用
asyncio
,请告诉我。boto3不支持asyncio。。。它的功能是阻塞,而不是等待。因此,这里最起码要做的就是从download\u file
调用中删除wait
,它应该可以工作
client.download_file(const.bucket_name, 'file/name.txt', '/tmp/name.txt')
print('file 1 downloaded')
client.download_file(const.bucket_name, 'file/class.txt', '/tmp/class.txt')
print('file 2 downloaded')
return True
但是,如果线程的事件循环中有任何其他并发任务,那么这将具有较差的并发属性:它们将被阻止,并且在下载过程中不会继续[这将使异步IO的使用变得有点不必要…并发任务的继续是异步IO的一种观点…]
为了获得更好的并发属性,您应该能够通过调用函数,默认情况下,它将在另一个线程中运行传递的函数
async def download_files(loop):
await loop.run_in_executor(None, client.download_file, const.bucket_name, 'file/name.txt', '/tmp/name.txt')
print('file 1 downloaded')
await loop.run_in_executor(None, client.download_file, const.bucket_name, 'file/class.txt', '/tmp/class.txt')
print('file 2 downloaded')
return True
或者,您可以使用,而不是使用boto3和threads(完全公开:关于滚动您自己的AWS身份验证的帖子是我写的)查看。也为更低级的研究。两者均可通过pip获得