【问题标题】:How to make uWSGI main thread not serve requests for the Django web application?如何使 uWSGI 主线程不为 Django Web 应用程序提供请求?
【发布时间】:2021-11-01 07:28:25
【问题描述】:

在我的 Django 应用程序中,在 __init__.py 中,我有一个启动事件循环的类。

class X:
  def __init__(self):
    self.__loop = asyncio.get_event_loop()

  async def foo(self):
    ...

  def do_stuff(self):
    # some logic here
    self.__loop.run_until_complete(foo())

在__init__.py我刚刚有

x = X()

在我的 Django 视图中,我愿意

from myapp import x

def example_view(request):
  result = x.do_stuff()
  return JsonResponse({"result": result})

但问题在于,对于 uWSGI,如果处理请求的线程与初始化期间使用的线程相同,我会收到 Django 的 SynchronousOnlyOperation 异常,因为它检测到该特定线程中正在运行的事件循环。

所以我的问题是,有没有办法不使用该初始化线程来处理请求或解决此问题的其他替代方法?

uwSGI配置为运行多进程多线程,--enable-threads

【问题讨论】:

    标签: python django python-asyncio uwsgi


    【解决方案1】:

    这个怎么样:

    class X:
    
        async def foo(self):
            ...
    
        def do_stuff(self):
            asyncio.run(foo())
    

    【讨论】:

    • 是的,这是一个可能的解决方案,我可能不得不去。但问题是我使用的是asyncio.BoundedSemaphore,如果为每个函数调用创建一个新的事件循环,我认为这没有意义。
    • 无论如何都必须采用这个解决方案,因为loop.run_until_complete 不是线程安全的,即使有等效的线程安全方法,使用起来感觉“hacky”(更不用说问题仍然存在)。标记为已接受。
    猜你喜欢
    • 2020-08-18
    • 2014-07-15
    • 1970-01-01
    • 2013-10-28
    • 1970-01-01
    • 2021-05-20
    • 1970-01-01
    • 2017-02-07
    • 1970-01-01
    相关资源
    最近更新 更多