Preface :
再編程的過程中, 很多時候為了 Performance 考量會採用 Multi-thread 的方式來提升程式的 throughput. 這邊我們要來簡單介紹一下如何在 Python 使用線程.
Thread Objects :
在 Python 可以使用模組 threading 來進行多線程的設計, 在該模組中有個類別 Thread 用來代表線程本身. 接著我們來看看這個類別的用法.
首先當 Thread 類別被實例化, 你可以呼叫物件上面的方法 start() 來啟動該線程, 事實上該方法會再呼叫方法 run() (Method representing the thread’s activity.). 一旦線程啟動, 它的狀態會變成 "alive" ; 當執行完畢 run() 後狀態便不在是 "alive". 你可以使用方法 is_alive() 來檢視該線程是否停留在 "alive" 狀態.
當線程呼叫其他線程物件上的方法 join(), 這會讓呼叫 join() 方法的線程被 blocked, 一直到被呼叫 join() 的線程結束為止.
另外每個線程都有自己的名字. 線程的名字可以透過建構子賦予, 且可以透過線程物件上的 name 屬性取得.
另外線程可以被標示程 "daemon thread". 用途是當剩下的線程都是 "daemon thread" 時, 主程式可以成功 exit 而不會等待這些 "daemon thread". 而這個屬性是會被子線程繼承下去, 而你可以透過 daemon 屬性進行設定.
Usage :
考慮我們定義一個工作類別 Job :
- class Job:
- def __init__(self, name):
- self.name = name
- def do(self):
- time.sleep(2)
- print("\t[Info] Job({0}) is done!".format(self.name))
如果是 Single thread, 我們便可以用下面代碼一次一個從 Queue 取出 Job 並執行 :
- st = datetime.datetime.now()
- while que.qsize() > 0:
- job = que.get()
- job.do()
- td = datetime.datetime.now() - st
- print("\t[Info] Spending time={0}!".format(td))
如果使用 Multi-thread 的話, 可以參考下面代碼, 共開 3 支線程 :
- import queue, time, threading, datetime
- class Job:
- def __init__(self, name):
- self.name = name
- def do(self):
- time.sleep(2)
- print("\t[Info] Job({0}) is done!".format(self.name))
- que = queue.Queue()
- for i in range(20):
- que.put(Job(str(i+1)))
- print("\t[Info] Queue size={0}...".format(que.qsize()))
- def doJob(*args):
- queue = args[0]
- while queue.qsize() > 0:
- job = queue.get()
- job.do()
- # Open three threads
- thd1 = threading.Thread(target=doJob, name='Thd1', args=(que,))
- thd2 = threading.Thread(target=doJob, name='Thd2', args=(que,))
- thd3 = threading.Thread(target=doJob, name='Thd3', args=(que,))
- # Start activity to digest queue.
- st = datetime.datetime.now()
- thd1.start()
- thd2.start()
- thd3.start()
- # Wait for all threads to terminate.
- while thd1.is_alive() or thd2.is_alive() or thd3.is_alive():
- time.sleep(1)
- td = datetime.datetime.now() - st
- print("\t[Info] Spending time={0}!".format(td))
Supplement :
* tutorialspoint > Python - while Loop Statements
* Queue – A thread-safe FIFO implementation
沒有留言:
張貼留言