在開發應用程式中,幾乎所有的專案都會用到thread,不同的程式語言有不同˙的叫用方法,但都大同小異。Thread的使用上最重要的不是在產生一個thread,而是如何結束一個thread,或是如何結束好幾個threads,以下介紹在Python中如何叫用並管理一或多個thread:
一般來說,create thread如下:
def job(): while 1: print("Child thread:", i) time.sleep(1) #In main code thread = threading.Thread.__init__(job) thread.start()這樣可以開始一個thread執行job()中的動作,但若job中的迴圈是如上範例的無限迴圈,必須要加上能讓其退出的機制:
stopped = 0 def job(): global stopped while stopped == 0: print("Child thread:", i) time.sleep(1) #In main code thread = threading.Thread.__init__(job) thread.start()這樣在主程序先將stopped設成1,再調用
thread.join()就可以將thread完整關閉並釋放記憶體空間。
多執行續的處理:基於這樣的方式,下面是進化版本,創建一個thread專用的class,並同時處理多個thread的執行與結束:
class EventHandleThread (threading.Thread):
def __init__(self, fun, name):
threading.Thread.__init__(self)
self.name = name
self.fun = fun
self.stopped = [0]
def run(self):
self.fun(self.name, self.stopped)
print ("Exiting " + self.name)
def stop(self):
self.stopped[0] = 1
在主程序中開始兩個thread,並加入m_thread的list中:global m_Threads
thread1 = EventHandleThread(EventHandleLoop, "Thread-EventHandle")
m_Threads.append(thread1)
m_Threads[0].start();
thread2 = EventHandleThread(UiHandleLoop, "Thread-UiHandleLoop")
m_Threads.append(thread2)
m_Threads[1].start();
在程序結束前將所有thread的stopped設為1(叫用stop() function) def closeAllThreads(self):
global m_Threads
for i in range(len(m_Threads)):
print ('stop main thread...')
try:
if m_Threads[i].is_alive():
m_Threads[i].stop()
m_Threads[i].join()
except:
print ('main thread except')
pass
留言
張貼留言