Apache挂起了Django / Matplotlib应用程序

时间:2014-03-11 21:39:38

标签: python django apache matplotlib

这里有新的StackOverflow用户。我需要有关Apache冻结问题的帮助。我在Win 7 64位上有一个WAMPServer设置,我正在使用python / django / mysql / mod_wsgi / matplotlib,试验动态渲染的图像。我正在使用Apache来提供静态文件。

我正在尝试从MySQL数据库中绘制数据。我的views.py文件如下。当我通过访问相应的网页调用函数“view_Stats”时,它调用“CreateFig”函数来创建并将.png文件保存到随后由Apache提供的目录中。它最初工作正常,但似乎在Apache挂起之前,最多可以对“CreateFig”函数进行8次调用。我必须在那时重新启动Apache,但它需要一段时间(分钟)才能重新启动。

查看Apache错误日志(见下文)显示了与Apache子进程相关的错误,需要Apache强制终止它。我怀疑某种内存泄漏/错误,但我对此很新,并且不能很好地排除故障;我用Google搜索了这个并在StackOverflow上四处看看,没有快乐。

任何帮助将不胜感激!

[Tue Mar 11 17:01:07.550093 2014] [core:notice] [pid 2820:tid 404] AH00094: Command line: 'c:\\wamp\\bin\\apache\\apache2.4.4\\bin\\httpd.exe -d C:/wamp/bin/apache/Apache2.4.4'
[Tue Mar 11 17:01:07.551093 2014] [mpm_winnt:notice] [pid 2820:tid 404] AH00418: Parent: Created child process 3528
[Tue Mar 11 17:01:07.856093 2014] [mpm_winnt:notice] [pid 3528:tid 324] AH00354: Child: Starting 150 worker threads.
[Tue Mar 11 17:04:53.233893 2014] [mpm_winnt:notice] [pid 2820:tid 404] AH00422: Parent: Received shutdown signal -- Shutting down the server.
[Tue Mar 11 17:05:23.248293 2014] [mpm_winnt:notice] [pid 2820:tid 404] AH00431: Parent: Forcing termination of child process 3528

来自views.py的代码如下:

from django.contrib import auth
from django.contrib.auth.models import User, Group
from django.core.context_processors import csrf
from django.shortcuts import render_to_response
from django.http import Http404, HttpResponseRedirect

from rwjcnlab import settings
from clientele.models import UserProfile
from reports.models import EEG, LTM, EMU, AEEG

import os, datetime
import numpy
from pylab import *
import matplotlib.pyplot as plt; plt.rcdefaults()
import matplotlib.pyplot as plt
import gc


# CREATE VIEWS HERE
def view_Stats(request):
    UID = UserProfile.objects.get(user_id = request.user.id)
    StatsEEG, StatsLTM, StatsAEEG, StatsEMU, start_date = ReportNumbers(UID.id)

    # Create figures
    CreateFig(StatsEEG, 300, 50, 'EEG', 'b')
    CreateFig(StatsLTM, 100, 10, 'LTM', 'r')
    CreateFig(StatsAEEG, 15, 3, 'AEEG', 'y')
    CreateFig(StatsEMU, 25, 5, 'EMU', 'c')

    return render_to_response('view_Stats.html', {
        'StatsEEG': StatsEEG,
        'StatsLTM': StatsLTM,
        'StatsAEEG': StatsAEEG,
        'StatsEMU': StatsEMU,
        'start_date': start_date,
        'user': request.user,
    })

def CreateFig(Stats, ymax, yinc, figname, c):
    nAll    = tuple(x[1] for x in Stats)
    nUser   = tuple(x[2] for x in Stats)
    xlabels = tuple(x[0].strftime("%b%y") for x in Stats)

    ind     = numpy.arange(len(xlabels)-1.4,-0.4,-1)    # the x locations for the groups
    width   = 0.8                                       # the width of the bars: can also be len(x) sequence

    plt.ioff()
    fig = plt.figure(figsize=(10, 5), dpi=72, facecolor='w', edgecolor='k')
    p1 = plt.bar(ind, nAll[1:], width, color=c)
    p2 = plt.bar(ind, nUser[1:], width, color='g')
    plt.title(figname+' Volumes at RWJUH')
    plt.xticks(ind+width/2., xlabels[1:])
    plt.yticks(numpy.arange(0,ymax,yinc))
    plt.legend( (p1[0], p2[0]), ('Total', 'User') )
    plt.savefig(os.path.join(settings.BASE_DIR, 'static/'+figname+'.png'))

    fig.clf()
    plt.close(fig)
    gc.collect()

    return

1 个答案:

答案 0 :(得分:2)

这可能是因为您在使用matplotlib时尝试连接到(可能是不存在的)X服务器。如果你的网络服务器上运行了X,你可能仍然希望避免使用matplotlib的交互式后端

编辑:刚刚看到你在Windows上。显然,不是因为在Windows上运行时,mattplotlib正在尝试连接到X服务器,但我和#39; d愿意打赌你的问题仍然与使用交互式后端和matplotlib试图连接到图形显示有关。)

如果你想在没有交互式图的情况下使用matplotlib(即不需要X服务器),那么你需要明确使用非交互式后端。 (例如Aggpdf等)

首先,删除from pylab import *。出于多种原因,这是一个非常糟糕的主意(提示,minmax并不是您认为的,除其他外。而且,你似乎没有使用它。您已经通过pyplot接口访问matplotlib功能,而numpy虽然是numpy名称空间。

接下来,之前import matplotlib.pyplot as plt(或者如果你决定不删除它之前from pylab import *),请执行以下操作:

import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot # etc...

现在,每当你制作一个新的数字时,matplotlib都不会尝试连接到X显示器。