3

我用 uwsgi 服务器运行 django。我的代码包含许多带有 urllib2 的 api 调用,如下所示:

with closing(urllib2.urlopen(request, timeout=1)) as f:
    content = f.read()

即使我设置了套接字超时,我也看到请求需要更多我想要的秒数。我猜这是因为超时限制了套接字连接而不是数据读取。

我想限制这个代码块。试图用它来实现它,signal.SIGALRM但它不适用于 uwsgi (我没有运行enable-threads)。但它适用于 Apache+mod_wsgi。线程超时看起来不可靠。

没有错误,SIGALRM 只是忽略了 harakiri 模式。我不擅长阅读 C 源代码,但这里出现这种行为的原因。

4

2 回答 2

8

使用线程支持编译的 Python 不会在其线程或fork()s中调用自定义信号处理程序,除非它使用 重新初始化PyOS_AfterFork(),这通常发生在 中os.fork(),但奇怪的是 uwsgi 默认不这样做。但是,它提供了一个选项--py-call-osafterfork,uwsgi 从站可以使用该选项处理信号,包括SIGALRM.

于 2015-11-17T02:19:48.273 回答
2

不要将 UNIX 信号用于此类事情,它们基本上是不可靠的。Harakiri 模式有一个“用户级别”的对应部分:

uwsgi.set_user_harakiri(10)
with closing(urllib2.urlopen(request, timeout=1)) as f:
    content = f.read()
uwsgi.set_user_harakiri(0)
于 2013-03-26T07:33:46.390 回答