这里有新的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
答案 0 :(得分:2)
这可能是因为您在使用matplotlib时尝试连接到(可能是不存在的)X服务器。如果你的网络服务器上运行了X,你可能仍然希望避免使用matplotlib的交互式后端
(编辑:刚刚看到你在Windows上。显然,不是因为在Windows上运行时,mattplotlib正在尝试连接到X服务器,但我和#39; d愿意打赌你的问题仍然与使用交互式后端和matplotlib试图连接到图形显示有关。)
如果你想在没有交互式图的情况下使用matplotlib(即不需要X服务器),那么你需要明确使用非交互式后端。 (例如Agg
,pdf
等)
首先,删除from pylab import *
。出于多种原因,这是一个非常糟糕的主意(提示,min
和max
并不是您认为的,除其他外。而且,你似乎没有使用它。您已经通过pyplot接口访问matplotlib功能,而numpy
虽然是numpy名称空间。
接下来,之前你import matplotlib.pyplot as plt
(或者如果你决定不删除它之前from pylab import *
),请执行以下操作:
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot # etc...
现在,每当你制作一个新的数字时,matplotlib都不会尝试连接到X显示器。