Python 3.x Boto3:需要一个未来或协同程序

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

我正在尝试使用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/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获得