【问题标题】:does a blocking network call within Django block all threads?Django 中的阻塞网络调用会阻塞所有线程吗?
【发布时间】:2011-02-10 03:30:56
【问题描述】:

我在 Windows 上的 Apache/Mod_WSGI 下运行 Django 服务器。作为处理我的用户请求的一部分,我做了很多需要网络 I/O 的事情。我通过 Django ORM 运行查询(到另一台机器上的数据库服务器)。我还进行非 Django ODBC 查询,读取网络共享上的文件和目录,并抓取其他网站。

我很确定至少我的一些网络 I/O 被阻塞(我想到了 ODBC 查询和网络抓取)。而且Windows上的Apache只有线程处理模型,没有多进程模型。

所以我的第一个问题是:如果我在响应请求时进行阻塞网络调用,会阻塞 Apache 服务器中的所有线程,还是仅阻塞响应请求的线程?

我的第二个问题是:这四种网络调用(Django ORM、ODBC、网络共享、HTTP)中的任何一种已知是非阻塞的吗?

【问题讨论】:

    标签: windows django apache mod-wsgi


    【解决方案1】:

    简单的答案是否定的,它不应该阻塞其他请求线程。不过,这取决于围绕阻塞调用发布 Python GIL 的 C 代码底层内容。围绕系统网络和文件系统函数的所有 Python 代码包装器都可以正确执行此操作。主流数据库适配器也应该没问题,因为他们也知道在必要时发布 GIL。阻塞问题通常只出现在天真的编写的第三方 C 扩展模块中,人们对此一无所知,但如今这种情况很少见。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-16
      • 2021-10-30
      • 2021-10-19
      • 1970-01-01
      • 2012-03-10
      相关资源
      最近更新 更多