2017-02-27 96 views
-1

我目前正在開發一個基於python的Raspberry pi 2應用程序,它有1GB內存。如何通過python線程減少內存消耗

在我的python應用程序中,我使用線程概念來顯示進度條(線程將執行主進程,正常循環執行用戶界面中的進度條)。

對於每次執行線程時,RAM存儲器減少8mb,並且在某些時間程序掛起後。

有時線程上的命令os.system("raspistill") is not working否則它說maximum recursion depth exceeded

任何人都可以幫我清除上述情況嗎?

def waiting2(wt): 
    wt.minsize(480,320) 
    wt.title("Reading") 
    wt.attributes('-fullscreen',True) 
    def animate(): 
     """ cycle through """ 
     img = next(pictures) 
     label["image"] = img 
     wt.after(delay, animate) 
    label = Tkinter.Label(wt) 
    label.place(x=150,y=60) 
    fname_list = \ 
    ['/home/pi/1/1 (1).gif', 
    '/home/pi/1/1 (2).gif', 
    '/home/pi/1/1 (3).gif', 
    '/home/pi/1/1 (4).gif', 
    '/home/pi/1/1 (5).gif', 
    '/home/pi/1/1 (6).gif', 
    '/home/pi/1/1 (7).gif', 
    '/home/pi/1/1 (8).gif', 
    '/home/pi/1/1 (9).gif', 
    '/home/pi/1/1 (10).gif', 
    '/home/pi/1/1 (11).gif', 
    '/home/pi/1/1 (12).gif', 
    '/home/pi/1/1 (13).gif', 
    '/home/pi/1/1 (14).gif', 
    '/home/pi/1/1 (15).gif', 
    '/home/pi/1/1 (16).gif', 
    '/home/pi/1/1 (17).gif', 
    '/home/pi/1/1 (18).gif', 
    '/home/pi/1/1 (19).gif', 
    '/home/pi/1/1 (20).gif', 
    '/home/pi/1/1 (21).gif', 
    '/home/pi/1/1 (22).gif', 
    '/home/pi/1/1 (23).gif', 
    '/home/pi/1/1 (24).gif', 
    '/home/pi/1/1 (25).gif', 
    '/home/pi/1/1 (26).gif', 
    '/home/pi/1/1 (27).gif', 
    '/home/pi/1/1 (28).gif', 
    '/home/pi/1/1 (29).gif', 
    '/home/pi/1/1 (30).gif', 
    '/home/pi/1/1 (31).gif', 
    '/home/pi/1/1 (32).gif', 
    '/home/pi/1/1 (33).gif', 
    '/home/pi/1/1 (34).gif', 
    '/home/pi/1/1 (35).gif', 
    '/home/pi/1/1 (36).gif', 
    '/home/pi/1/1 (37).gif', 
    '/home/pi/1/1 (38).gif', 
    '/home/pi/1/1 (39).gif', 
    '/home/pi/1/1 (40).gif', 
    '/home/pi/1/1 (41).gif', 
    '/home/pi/1/1 (42).gif', 
    '/home/pi/1/1 (43).gif', 
    '/home/pi/1/1 (44).gif', 
    '/home/pi/1/1 (45).gif', 
    '/home/pi/1/1 (46).gif', 
    '/home/pi/1/1 (47).gif', 
    '/home/pi/1/1 (48).gif', 
    '/home/pi/1/1 (49).gif', 
    '/home/pi/1/1 (50).gif', 
    '/home/pi/1/1 (51).gif', 
    '/home/pi/1/1 (52).gif', 
    '/home/pi/1/1 (53).gif', 
    '/home/pi/1/1 (54).gif', 
    '/home/pi/1/1 (55).gif', 
    '/home/pi/1/1 (56).gif', 
    '/home/pi/1/1 (57).gif', 
    '/home/pi/1/1 (58).gif', 
    '/home/pi/1/1 (59).gif', 
    '/home/pi/1/1 (60).gif', 
    '/home/pi/1/1 (61).gif', 
    '/home/pi/1/1 (62).gif', 
    '/home/pi/1/1 (63).gif', 
    '/home/pi/1/1 (64).gif', 
    '/home/pi/1/1 (65).gif', 
    '/home/pi/1/1 (66).gif', 
    '/home/pi/1/1 (67).gif', 
    '/home/pi/1/1 (68).gif', 
    '/home/pi/1/1 (69).gif', 
    '/home/pi/1/1 (70).gif', 
    '/home/pi/1/1 (71).gif', 
    '/home/pi/1/1 (72).gif', 
    '/home/pi/1/1 (73).gif',] 
    pictures = it.cycle(Tkinter.PhotoImage(file=img_name) for img_name in fname_list) 
    # milliseconds 
    if batch==1: 
     delay=10 
    else: 
     delay = 40*batchcount 
    animate() 
    logo7=PhotoImage(file="/home/pi/New2/close.gif") 
    button1 = Button(wt, width = 30, height = 30, image=logo7,command=wt.destroy) 
    button1.place(relx=0, x=445, y=0) 
    wt.mainloop() 

def batch_two_big(wt): 
    def ext(): 
     wt.destroy() 
    GPIO.output(40,GPIO.LOW) 
    sleep(1) 
    os.system("raspistill -o /home/pi/python/%s.jpeg -t 1000 -cfx 128:128 -co 100" %batchcount) 
    GPIO.output(40,GPIO.HIGH) 
    wt.after(100,ext) 
    winmain() 


def batchcallback1(): 
    wt=Tkinter.Toplevel() 
    t1=threading.Thread(target=batch_two_big,args=(wt,)) 
    t1.start() 
    waiting2(wt) 
    t1.join() 

def winmain(): 
    def ext(): 
     board1.destroy() 
    def jump(): 
     board1.after(100,ext) 
     batchcallback1() 

    board1 = Tkinter.Toplevel() 
    board1.title("PATIENT DETAILS") 
    board1.minsize(480,320) 
    logo8=PhotoImage(file="/home/pi/New2/read.gif") 
    board1.attributes('-fullscreen',True) 
    Label(board1, text="SAMPLE ID").place(relx=0, x=40, y=60) 
    e1=Entry(board1) 
    e1.place(relx=0, x=130, y=60) 
    b1=Button(board1,text="READ",image=logo8,bd=5,width=100,height=20,compound='left',fg='black',font='Times 12 bold', command=jump) 
    b1.image=logo8 
    b1.place(relx=0, x=80, y=5) 
    board1.mainloop() 
winmain() 
+0

向我們展示代碼,否則我們無法幫助,無論如何只是閱讀您的描述,在代碼中的某些內容真的很糟糕,您在線程中遞歸調用了什麼? – Netwave

+0

尊敬的Daniel Sanchez先生,正如我上面所說,主窗口有一個按鈕,當我按下它時,用戶界面顯示進度條,並在後臺通過os.system執行raspistill命令。 raspistill命令用於通過相機拍攝照片。我正在使用raspbian wheezhy發行版的Raspberry pi 2(單板嵌入式Linux計算機,包含1GB RAM內存)。當我平行監控免費的RAM空間時,每按一下按鈕,RAM的內存就減少8MB。一旦ram達到50mb以下,就會顯示上述錯誤。 –

回答

0

好吧,你有一個圓形的遞歸調用:

def batch_two_big(wt): 
    def ext(): 
     wt.destroy() 
    GPIO.output(40,GPIO.LOW) 
    sleep(1) 
    os.system("raspistill -o /home/pi/python/%s.jpeg -t 1000 -cfx 128:128 -co 100" %batchcount) 
    GPIO.output(40,GPIO.HIGH) 
    wt.after(100,ext) 
    winmain() 


def batchcallback1(): 
    wt=Tkinter.Toplevel() 
    t1=threading.Thread(target=batch_two_big,args=(wt,)) 
    t1.start() 
    waiting2(wt) 
    t1.join() 

def winmain(): 
    def ext(): 
     board1.destroy() 
    def jump(): 
     board1.after(100,ext) 
     batchcallback1() 

所以,winmain結合調用jump的按鈕,然後在跳你打電話batchcallback1至極調用batchcallback1至極呼叫winmain再次重啓循環。 儘量不要從batch_two_big調用winmain

def batch_two_big(wt): 
    GPIO.output(40,GPIO.LOW) 
    sleep(1) 
    os.system("raspistill -o /home/pi/python/%s.jpeg -t 1000 -cfx 128:128 -co 100" %batchcount) 
    GPIO.output(40,GPIO.HIGH) 
    wt.after(100,ext) 

不管怎樣,使得一個線程在batchcallback1看起來沒用,因爲你只是等待它。

+0

是的,但是對於每次調用batchcallback1,它會創建線程對象t1,並且對於每次迭代,它將從ram中消耗8mb。我試過del t1命令,但不起作用。 –

+0

@SriKrishnan通過構建一個新的線程來創建自己的堆棧,所以消耗的RAM將永遠存在,我想你可能不想創建它們或看看corrutines。 – Netwave

相關問題