mod_wsgi在RuntimeWarning上挂起:除以零

时间:2012-07-26 13:30:42

标签: python apache warnings mod-wsgi

我有一些python代码可能导致除以0,但它在python(3.2)解释器中正确运行。但是,如果我尝试使用mod_wsgi运行它,它只会挂起而不会出现错误,并且不会提供请求。

解释器中的警告(输出正确):pathwayAnalysis.py:30: RuntimeWarning: divide by zero encountered in double_scalars

有人知道使用mod_wsgi运行此操作的正确方法是什么?

代码如下。差异和大小都是长度为2的numpy浮点数组。difference中的浮点数可能为0(但不是两者)。在此之前添加difference += 0.0001使其正常运行,但由于输出不准确,因此不是一个好的解决方案:

if abs(difference[0] / difference[1]) > (size[0] / size[1]):
    ratio = abs(size[0] / difference[0])
else: ratio = abs(size[1] / difference[1])
for i in range(len(base)):
    result.append(base[i] + difference[i] * ratio/2)
return array(result)

执行以下操作无效:

try:
    cond = abs(difference[0] / difference[1]) > (size[0] / size[1])
except RuntimeWarning:
    cond = True
# hangs before this point
if cond:
    '''as above'''

一些测试代码(使用difference定义之一):

def application(environ, start_response):
    from numpy import array

    size = array([10., 10.])

    difference = array([115., 0.]) # hangs
    difference = array([115., 10.]) # returns page with text 'Yes.'

    if abs(difference[0]/difference[1]) > (size[0]/size[1]):
        output = 'Yes.'
    else:
        output = 'No.'

    status = '200 OK'

    response_headers = [('Content-type', 'text/plain'),\
        ('Content-Length', str(len(output)))]
    start_response(status, response_headers)

    return [output]

1 个答案:

答案 0 :(得分:1)

Python的一些使用C扩展模块的第三方软件包,包括numpy,只能在Python主解释器中使用,不能在子解释器中使用,因为默认使用mod_wsgi。结果可能是线程死锁,不正确的行为或进程崩溃。详情请见:

http://code.google.com/p/modwsgi/wiki/ApplicationIssues#Python_Simplified_GIL_State_API

解决方法是使用以下方法强制WSGI应用程序在进程的主解释器中运行:

WSGIApplicationGroup %{GLOBAL}

如果在同一服务器上运行多个WSGI应用程序,您可能希望开始使用守护程序模式进行调查,因为某些框架不允许多个实例在同一个解释器中运行。 Django就属于这种情况。因此,使用守护进程模式,因此每个进程都在自己的进程中,并强制每个进程在其各自的守护进程模式进程组的主解释器中运行。