python FastAPI端点的多个DynamoDB(PynamoDB)查询引发了BrokenResourceError

x9ybnkn6  于 2023-01-04  发布在  Python
关注(0)|答案(2)|浏览(127)

我尝试在一个API请求中进行多个查询。我发现我可以进行1个查询而没有任何问题,但当我尝试在同一个请求中进行多个查询时,我以BrokenResourceError结束。我确实得到了我想要的返回值,但由于此错误,看起来像是我的后端挂起,导致其他请求等待此请求返回。
我找不到关于这个特定问题的任何信息,但在查看错误后,我阅读了引发BrokenResourceError的以下原因。

  • 资源已关闭或已被另一任务释放
  • 外部进程或系统已关闭或以其他方式释放资源
  • 资源在使用时遇到错误或异常,不再是functionalCode

我相信我被影响的是The resource was closed or otherwise disposed of by another task

  • 该资源正在多个任务之间共享,其中一个任务已使用完该资源并已关闭或释放该资源。
  • 资源正由已被取消或中断的任务使用,并且作为取消或中断过程的一部分,资源正被关闭或处置。
  • 该资源正被作为任务组的一部分的任务使用,并且该组正被取消或中断,从而导致该组中的所有任务被取消或中断并且它们的资源被关闭或处置。

我试过单独使用Boto3而不是PynamoDB,但没有成功。
下面的示例代码引发异常。

@my_router.get("/my_endpoint")
async def my_endpoint(
):
    attributes = []
    for x in range(0, 10):
        attributes.append(PynamoDBClass.get(
            hash_key="hash_key",
            range_key="range_key",
            consistent_read=True,
        ).attribute_values)
    return attributes

使用boto3而不是pynamoDB将查询拆分为多个请求(工作正常,但不适合我的情况)查看异常和异常原因。尝试在一个查询中获取所有数据,但最终出现相同的错误。:思考:可能是请求花费的时间太长。

xqk2d5yq

xqk2d5yq1#

我尝试在一个API请求中进行多个查询。
这并不清楚,但看起来你有一个分区和排序键的列表,你想为每个键检索相应的项。为此,你需要使用BatchGetItem

item_keys = [('forum-{0}'.format(x), 'subject-{0}'.format(x)) for x in range(1000)]
for item in Thread.batch_get(item_keys):
    print(item)

https://pynamodb.readthedocs.io/en/stable/batch.html#batch-gets

2nbm6dog

2nbm6dog2#

我为查询创建了异步任务,并等待响应

task = asyncio.create_task(get_data())
value = await task

相关问题