新的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),那么您需要显式地使用非交互式后端。(如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显示