【问题标题】:Why is my Django view hanging when I use asyncio.gather on a sync_to_async function call, but not when I call it directly?为什么当我在 sync_to_async 函数调用上使用 asyncio.gather 时我的 Django 视图挂起,但当我直接调用它时却没有挂起?
【发布时间】:2022-12-16 05:02:58
【问题描述】:

我有一个调用 asgiref.sync.async_to_sync 函数的 Django 视图,该函数查询远程 API - 我正在为一群员工更新工资单数据。在其中一个调用中,我必须再次访问数据库,因此有一个 asgiref.sync.sync_to_async 装饰函数来收集该数据。我使用 asyncio.gather 同时运行员工更新函数调用,但这会无限期挂起,甚至不会进入数据库调用 - 即使我在收集列表中只有一个调用,也会发生这种情况。等待功能虽然工作正常。一切都在 Uvicorn 下作为 ASGI 应用程序运行。有任何想法吗?

这是一个最小的复制:

@sync_to_async
def _get_database_employee_payslips(employee_data):
    print(f"Entering DB function")
    return employee_data

@async_to_sync
async def get_full_employees_data(_, __):
    print(f"This works")
    ret = await _get_database_employee_payslips({'id': 1625841})
    print(f"Got {ret}")

    print(f"This doesn't")
    ret = await asyncio.gather(*[
        _get_database_employee_payslips({'id': employee_id})
        for employee_id in [1625841]
    ], return_exceptions=True)    
    print(f"We're hung in the above call")

    return ret

结果:

INFO 2022-09-27 14:20:20,234 on 10776 140271592661440 Application startup complete.
DEBUG 2022-09-27 14:20:22,163 middleware 10776 140271484180032 process_request
DEBUG 2022-09-27 14:20:22,163 model_factory 10776 140271484180032 No maximum request body size is set, continuing.
DEBUG 2022-09-27 14:20:22,183 model_factory 10776 140271484180032 Created new request model with pk 161dfa90-4082-4ef1-8ab0-84d613c25550
This works
Entering DB function
Got {'id': 1625841}
This doesn't

环境:

  • WSL2
  • Ubuntu 22.04.1 LTS
  • 蟒蛇 3.10.4

Python 包(只是那些看起来相关的包):

aiohttp==3.8.3
aiosignal==1.2.0
anyio==3.6.1
asgiref==3.5.2
async-timeout==4.0.2
asyncio==3.4.3
Django==4.1.1
uvicorn==0.18.3
uvloop==0.17.0
uWSGI==2.0.20

【问题讨论】:

  • 同样的问题在这里。
  • 我也是,用达芙妮

标签: python django python-asyncio


【解决方案1】:

这似乎是一个已知问题——嵌套 async_to_sync 和 sync_to_async 会使调用无限期挂起,请参阅 https://code.djangoproject.com/ticket/32409

【讨论】:

    猜你喜欢
    • 2020-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-05
    • 2015-11-02
    相关资源
    最近更新 更多