我有一个spawns a new thread for each log entry的Python日志处理程序,在新线程中,日志被发送到另一台服务器。但是,我发现请求间歇性地超时。如果我禁用处理程序,问题就会消失。
我尝试过其他WSGI服务器(WSGIUtils,WSGIRef),我无法重现这个问题。
有什么想法吗?
我正在使用同步工作者和Debian上的Django 1.6运行Gunicorn 19.3。
答案 0 :(得分:0)
我认为这是GIL的另一个案例 - Global Interpreter Lock。假设发生这种情况:
看起来不错,对。但是,如果线程更快地完成工作呢?然后你得到:
并且根据线程所持有的锁或它调用的OS函数,线程可能不会释放GIL一段时间,这会阻止工作者或至少阻止响应完全传递。
查看代码时,我发现您正在为每条日志消息创建SSL连接。 SSL非常,非常,非常<非常昂贵。不要那样做。相反,创建一个工作线程,打开SSL套接字一次并保持打开状态。当您写入套接字时,python库应该释放GIL,以便其他代码可以工作。但我不确定Python是否会在打开套接字时释放锁定。