Apache挂起Django / Matplotlib应用



新的StackOverflow用户在这里。我需要帮助解决Apache的冻结问题。我在win7 64位上安装了WAMPServer,我正在使用python/django/mysql/mod_wsgi/matplotlib,尝试动态渲染图像。我使用Apache来提供静态文件。

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

查看Apache错误日志(见下文),显示一个与Apache子进程相关的错误,需要Apache强制它终止。我怀疑某种内存泄漏/错误,但我是很新的,不能很好地排除故障;我在谷歌上搜索了这个,并在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

这可能是因为您在使用matplotlib时试图连接到一个(可能不存在的)x服务器。如果您的web服务器上运行X,您可能仍然希望避免使用matplotlib

的交互式后端。

(Edit:刚刚看到你在windows上。显然,当mattplotlib在Windows上运行时,并不是试图连接到x服务器,但我愿意打赌,您的问题仍然与使用交互式后端和matplotlib试图连接到图形显示有关。

如果您想使用matplotlib而不需要交互式绘图(即不需要X-server),那么您需要显式地使用非交互式后端。(如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显示

相关内容

最新更新