2013-10-06 42 views
1

所以我寫這個劇本:Python的不同線程正在扼殺整個程序

def schedule_setup(): 
# KILL OLD THREADS SHOULD THEY EXIST 
global active 
active = False 
time.sleep(3) 
active = True 
global threadlist 
threadlist = [] 

try: 
    sql = "SELECT TIME_TO_RUN FROM time_table" 
    cursor.execute(sql) 
    results = cursor.fetchall() 
    for row in results: 
     #row[0].strftime('%H:%M') 
     t = threading.Thread(target=th,args=(row[0].strftime('%H:%M'),)) 
     t.start() 
     threadlist.append(t) 
    # JOIN all threads to main memory 
    #for count in threadlist: 
     #count.join() 
    sql = "UPDATE motor SET UPDATE_SCHEDULE = 0" 
    try: 
     cursor.execute(sql) 
     # commit the changes in database 
     db.commit() 
    except: 
     # Rollback in case there is any error 
     print "no worky" 
     db.rollback() 
except: 
    print "Error: UNABLE TO GET TABLE DATA" 

它需要在SQL時間設置和創建一個計劃的事件做一個動作。我把所有活動線程的線程「殺手」放在開頭,這樣如果我再次調用這個線程,因爲時間已經更新,它可以殺死舊的線程並用新線程替換它們。它所有的工作我怎麼想,但只要動作被稱爲整個程序崩潰...這裏是它調用的代碼:

def th(run_time): 
    global active 
    schedule.every().day.at(run_time).do(run_motor) 

    while active == True: 
     schedule.run_pending() 
     time.sleep(1) 

怎麼看線程檢查每一秒?所以線程在我嘗試創建新線程時被殺死,但是當「run_motor」被調用時,後綴應該是無限循環的主程序,有時還有其他線程仍然在運行,所以這對我來說很奇怪。

+0

「崩潰」究竟意味着什麼?你有錯誤信息嗎?你有追溯嗎?如果是這樣,請爲我們拼出來。 –

+0

順便說一句,既然你說有時線程還在繼續,肯定你的'time.sleep(3)'不足以讓所有的線程結束。儘管這裏沒有足夠的信息來猜測爲什麼。如果你想確保他們完成了,你應該是'.join()'線程 - 睡眠永遠不是一個可靠的選擇。 –

+0

如果你在代碼中修正了縮進 - 例如'schedule_setup()'結束了,那麼它也會有所幫助;-)因爲所有內容都與左邊界齊平。 –

回答

0

不能sanely殺死一個線程。而不是殺死一個線程,編寫線程去做什麼,只做什麼,你希望做什麼。那樣,你就沒有必要殺了它。

如果你與另外兩個人共享一輛車,而車不在車道上,那麼你不能殺死駕駛該車的人。這樣可以釋放汽車供您使用,但它不會在車道上行駛,因爲您在駕駛員有機會將其放回之前殺死了駕駛員。相反,打電話給他們,告訴他們把車帶回來,讓他們在完成後放開車。

+0

對,如果你閱讀我沒有直接殺死一個線程,我讓線程自行結束,我使用time.sleep(3)來確保我給線程足夠的時間來正確結束自己。我的問題是當線程正在執行任務時,當它運行線程應該繼續執行的任務時,它不會執行任務,程序會崩潰。 –