为什么Gunicorn同步工作人员在产生线程时会挂起?

时间:2015-04-17 14:15:37

标签: python gunicorn

我有一个spawns a new thread for each log entry的Python日志处理程序,在新线程中,日志被发送到另一台服务器。但是,我发现请求间歇性地超时。如果我禁用处理程序,问题就会消失。

我尝试过其他WSGI服务器(WSGIUtils,WSGIRef),我无法重现这个问题。

有什么想法吗?

我正在使用同步工作者和Debian上的Django 1.6运行Gunicorn 19.3。

1 个答案:

答案 0 :(得分:0)

我认为这是GIL的另一个案例 - Global Interpreter Lock。假设发生这种情况:

  • 请求来自
  • 工人开始
  • 工作人员日志 - >线程已启动
  • 工人已完成
  • 发送回复
  • 线程记录事件

看起来不错,对。但是,如果线程更快地完成工作呢?然后你得到:

  • 请求来自
  • 工人开始
  • 工作人员日志 - >线程已启动
  • 工人已完成
  • 线程记录事件
  • 发送回复

并且根据线程所持有的锁或它调用的OS函数,线程可能不会释放GIL一段时间,这会阻止工作者或至少阻止响应完全传递。

查看代码时,我发现您正在为每条日志消息创建SSL连接。 SSL非常,非常,非常<非常昂贵。不要那样做。相反,创建一个工作线程,打开SSL套接字一次并保持打开状态。当您写入套接字时,python库应该释放GIL,以便其他代码可以工作。但我不确定Python是否会在打开套接字时释放锁定。