0

0 による除算になる可能性のある Python コードがいくつかありますが、Python (3.2) インタープリターで正しく実行されます。ただし、mod_wsgi を使用して実行しようとすると、エラーが発生せずに単にハングし、要求が処理されません。

インタプリタの警告 (出力は正しい):pathwayAnalysis.py:30: RuntimeWarning: divide by zero encountered in double_scalars

mod_wsgi を使用してこれを実行する正しい方法を知っている人はいますか?

コードは以下です。difference と size はどちらも、長さ 2 の numpy float 配列です。float in のどちらか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]
4

1 に答える 1

1

C拡張モジュールを使用するPython用の一部のサードパーティパッケージ(これにはnumpyが含まれます)は、Pythonメインインタープリターでのみ機能し、デフォルトでmod_wsgiが使用するため、サブインタープリターでは使用できません。その結果、スレッドのデッドロック、誤った動作、またはプロセスのクラッシュが発生する可能性があります。これらの詳細は次のとおりです。

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

回避策は、以下を使用して、WSGIアプリケーションをプロセスのメインインタープリターで実行するように強制することです。

WSGIApplicationGroup %{GLOBAL}

同じサーバーで複数のWSGIアプリケーションを実行している場合、一部のフレームワークでは複数のインスタンスを同じインタープリターで実行できないため、デーモンモードを使用して調査を開始することをお勧めします。これはDjangoの場合です。したがって、デーモンモードを使用して、それぞれが独自のプロセスになり、それぞれがそれぞれのデーモンモードプロセスグループのメインインタープリターで実行されるようにします。

于 2012-07-29T21:02:50.310 に答える