以编程方式终止uwsgi工作者

时间:2015-03-27 12:09:54

标签: python nginx uwsgi web.py

在我的应用程序中,我需要"模拟" HTTP超时。简而言之,在这种情况下:

client -> myapp -> server

clientmyapp建立HTTP POST连接,并将其转发至server。但是,server由于网络问题或类似问题而无法响应。我遇到了client的{​​strong>开放TCP会话,我需要放弃。

我的应用程序使用web.py,nginx和uwsgi。

我无法返回自定义HTTP错误,例如418 I am a teapot - 它必须是连接超时才能尽可能地反映server的行为。

一个hack-y解决方案可能(我猜)仅time.wait()直到client断开连接,但这会使用uwsgi线程,我觉得它可能导致资源匮乏,因为{{{ 1}}其他连接可能会发生超时。另一种方法指出here但是这个解决方案意味着将某些内容返回server,这不是我的情况。

所以我的问题是:是否有一种优雅的方法可以从python代码中以编程方式杀死client工作者?

到目前为止,我已找到

  • set_user_harakiri(N)我可以与uwsgi结合使用。然而,在这种情况下,uwsgi检测到harakiri并尝试重新产生该工作者。
  • worker_id()但我不确定如何处理它 - 我找不到有关使用它的大量文档
  • 建议使用time.sleep(N+1)解释here
  • disconnect()似乎没有做任何事情,因为代码会继续并返回connection_fd()
  • suspend()会暂停实例,但NGINX会返回样板错误页面

还有其他想法吗?

更新

事实证明它比这复杂得多。如果我只是关闭套接字或断开与uwsgi的连接,则nginx Web服务器会检测到服务器错误'并返回500样板错误页面。并且,我不知道如何告诉nginx停止这么有用。

1 个答案:

答案 0 :(得分:0)

答案是两者的结合。

  1. 从python应用程序返回444
  2. 按照on this answer的说明配置nginx,即使用uwsgi_intercept_errors指令。