Кукольный сюжет создать фигуру не удалось через несколько минут

Я пишу небольшую программу, используя web.py, и в одном из классов я использую numpy/plot.

Я обнаружил, что каждый раз, когда я захожу на страницу, она отлично работает. но через несколько минут функция plt.figure() зависла! эта функция никогда не вернется! Это так странно.

пожалуйста, посмотрите мои коды:

def DrawMapMain(MapParameter,inputfile='out.txt',imgfile='out.png'):
    print "DrawMapMain..."
    plt.ioff() # turn off interactive mode
    plt.close('all')
    xmin,xmax,ymin,ymax = MapParameter['xmin'],MapParameter['xmax'],MapParameter['ymin'],MapParameter['ymax']
    print('LevelFile:',MapParameter['LevelFile'])
    LonCenter = (xmin+xmax)/2.0
    LatCenter = (ymin+ymax)/2.0
    nx, ny = 200,200
    if(not os.path.isfile(inputfile)):
        print(u'输入文件%s不存在,请检查!'%(inputfile))
        sys.exit(0)
    Region = np.loadtxt(inputfile)
    #print(Region)
    x,y,z = Region[:,1],Region[:,2],Region[:,3]
    lon_array = np.linspace(xmin, xmax, nx)
    lat_array = np.linspace(ymin, ymax, ny)

    print('Data lon/lat box :',x.min(),x.max(),y.min(),y.max())
    print(u'离散点插值到网格')
    zi,xi,yi = Interpolater.griddata_all(x,y,z,lon_array,lat_array,func='line_rbf')#scipy_idw')# #line_rbf
    print(u'扩展矩阵插值: ')
    zi,xi,yi,lon_array,lat_array,nx,ny=Interpolater.extened_grid(zi,lon_array,lat_array,zoom=int(2)) #
    print(u'mask非绘图区域')
    grid1 = Interpolater.build_inside_mask_array(MapParameter['ShapeFile'],lon_array,lat_array)
    zi[np.logical_not(grid1)]=np.NaN

    #-----------------------------------------------------------------------------------
    print(u'Create figure...')
    #fig = plt.figure(num=1,figsize=(12, 9), dpi=100)
    fig = plt.figure(figsize=(12, 9), dpi=100)
    #fig = plt.figure()
    print(u'Create figure...Done')
    .........skipped

При первом посещении страницы я получил:

mask非绘图区域
Create figure...
Create figure...Done
(104, 35, 108, 39.5)

это нормально, но через некоторое время, посетив снова, я получил:

mask非绘图区域
Create figure...

и я вижу, как процесс 'python' забирает 25% моего процессора (который имеет 4 ядра), это означает, что он заходит в тупик!

это мой класс web.py, для справки:

class Month:
    def POST(self): 
        form = ParameterForm() 
        if not form.validates(): 
            return render.Month(form)
        else:
            StationInfoFile='./StationsId.txt' # make sure this file is exist.
            if(not os.path.isfile(StationInfoFile)):
                print(u'StationInfoFile 文件%s不存在!'%(inputfile))
                sys.exit(0)
            StationsInfo = np.loadtxt(StationInfoFile) # load all data as integer and float, not string
            StationsId,StationsLon,StationsLat = StationsInfo[:,0].astype(np.int64),StationsInfo[:,1],StationsInfo[:,2]
            basedir, DataCats, DataCatsDict=u'D:/测试数据',[ u'逐日平均', u'逐日降水'],{ u'逐日平均':'td', u'逐日降水':'rd'}
            iFrom,iEnd= \
                int(form['Start Year'].value)*10000+ int(form['Start Month'].value)*100+ int(form['Start Day'].value), \
                int(form['End Year'].value)*10000+ int(form['End Month'].value)*100+ int(form['End Day'].value) # value from form is string!

            MapParameter=GetMapParameter()
            if (u'温度' == form['Data Source'].value):
                d=u'逐日平均'
                tmpDataTxt='Test_temp.txt'
                tmpOutPNG='./static/'+'Test_temp.png'
                MapParameter['LevelFile']='.\maplev_temp.LEV'
                MapParameter['Title']=u'逐日平均'
            elif (u'降水(mm)' == form['Data Source'].value): 
                d=u'逐日降水'
                tmpDataTxt='Test_pred.txt'
                tmpOutPNG='./static/'+'Test_temp.png'
                MapParameter['LevelFile']='.\maplev_rain.LEV'
                MapParameter['Title']=u'逐日降水'
            else:
                print "form['Data Source'].value=",form['Data Source'].value
            print "----------- PROCESSING FOR CATEGORY:",d
            tmpMeanVal=[]
            for i in range(len(StationsId)):
                s,lo,la=StationsId[i],StationsLon[i],StationsLat[i]
                #print basedir,d, str(s),DataCatsDict[d]+'.txt'
                datafile=os.path.join(basedir,d, str(s))+DataCatsDict[d]+'.txt'
                print datafile,iFrom,iEnd
                data=getdata.GetData(datafile,iFrom,iEnd)
                a=np.mean(np.array(data)[:,1])*0.1
                tmpMeanVal.append([s,lo,la,a])
            rec=np.array(tmpMeanVal,dtype=[('int','int'),('float','float')])
            print 'Writing data ...'
            np.savetxt(tmpDataTxt,tmpMeanVal,fmt="%6i %-7.2f %-7.2f %8.2f")
            print 'Writing data ... Done.'
            sssss=open(tmpDataTxt,'r')
            print sssss.read()
            sssss.close()
            DrawMapMain(MapParameter,inputfile=tmpDataTxt,imgfile=tmpOutPNG)
            return render.Reports(tmpOutPNG)

Сначала я подозреваю, что у plt.figure могут быть проблемы с утечкой памяти, поэтому я clf,plt.close('all') в начале и в конце функции оба! Я даже написал сегмент тестового кода:

if __name__ == "__main__":
    MapParameter=GetMapParameter()
    MapParameter['LevelFile']='.\maplev_rain.LEV'
    MapParameter['Title']=u'逐日降水'
    for iloop in range(0,10):
        DrawMapMain(MapParameter,inputfile='Test_pred.txt',imgfile='c:/Test_pred'+str(iloop)+'.png')
    MapParameter['LevelFile']='.\maplev_temp.LEV'
    MapParameter['Title']=u'逐日temp'
    for iloop in range(0,10):
        DrawMapMain(MapParameter,inputfile='Test_temp.txt',imgfile='c:/Test_temp'+str(iloop)+'.png')

этот код работает нормально. Это так устроено, кто-нибудь знает какую-нибудь подсказку? большое спасибо!

1 ответ

На этот вопрос есть ответ в комментариях:

Какой бэкэнд matplotlib вы используете? Вы должны использовать один из неинтерактивных, если вы запускаете вещи с веб-сервера. Например, сделать импорт matplotlib; matplotlib.use('Agg') перед импортом matplotlib.pyplot как plt. - Джо Кингтон 16 января в 17:56

Для получения дополнительной информации о бэкэндах matplotlib см.: http://matplotlib.org/faq/usage_faq.html - Джо Кингтон, 17 января в 15:21.

Другие вопросы по тегам