我在Windows上运行Apache / Mod_WSGI下的Django服务器。作为处理我的用户请求的一部分,我做了很多需要网络I / O的事情。我通过Django ORM运行查询(到另一台机器上的数据库服务器)。我也做了非Django ODBC查询,我读了网络共享上的文件和目录,我刮了其他网站。
我非常确定至少有一些网络I / O是阻塞的(ODBC查询和网页抓取跳跃于脑海)。而Windows上的Apache只有一个线程处理模型,而不是多进程模型。
所以我的第一个问题是:如果我在响应请求时进行阻塞网络调用,是否会阻止Apache服务器中的所有线程,或者仅阻止响应请求的线程?
我的第二个问题是:这四种网络调用(Django ORM,ODBC,网络共享,HTTP)中的任何一种都是非阻塞的吗?
答案 0 :(得分:2)
简单的答案是否定的,它不应该阻止其他请求线程。这虽然取决于发布Python GIL围绕阻塞调用的C代码底层内容。围绕系统网络和文件系统功能的所有Python代码包装器都可以正确执行此操作。对于主流数据库适配器,您也应该没问题,因为他们也知道在必要时释放GIL。阻塞的问题通常只是天真地编写了第三方C扩展模块,人们对此知之甚少,但现在这种情况非常罕见。