2016年12月9日 星期五

Python_Note21

Multithreading

處理程序 (Process)是作業系統中應用程式的執行實例,而執行緒 (Thread)是處理程序內部的執行單元。當系統建立一個處理程序後,同時也建立一個主執行緒。而每個處理程序也可以有多個執行緒。使用多執行緒可以充分利用CPU來實現平行處理 (Parallel processing)。

Python 3透過 threading 模組提供許多對執行緒程式設計的支援。

threading — Thread-based parallelism

https://docs.python.org/3/library/threading.html

建立執行緒

透過繼承 threading模組中 Thread類別來建立新類別,在新建立的類別中多載 run方法,然後透過 start方法建立執行緒。建立執行緒後將執行 run方法。
start()
Start the thread’s activity.
It must be called at most once per thread object. It arranges for the object’s run() method to be invoked in a separate thread of control.
This method will raise a RuntimeError if called more than once on the same thread object.
run()
Method representing the thread’s activity.
You may override this method in a subclass. The standard run() method invokes the callable object passed to the object’s constructor as the target argument, if any, with sequential and keyword arguments taken from the args and kwargs arguments, respectively.

如果一個執行緒或函數在執行過程中呼叫另一個執行緒,且必須等所呼叫的執行緒操作完後才能繼續目前執行緒的執行,那麼在呼叫執行緒中可以此用被呼叫執行緒的 join方法。

join(timeout=None)
Wait until the thread terminates. This blocks the calling thread until the thread whose join() method is called terminates – either normally or through an unhandled exception –, or until the optional timeout occurs.

當執行緒建立後,可以用 Thread 物件的 is_alive 方法來檢視執行緒是否執行。

is_alive()
Return whether the thread is alive.
This method returns True just before the run() method starts until just after the run() method terminates. The module function enumerate() returns a list of all alive threads.

當執行緒建立後,還可以用 Thread 物件的 setName 方法來設定執行緒名稱,以便對不同執行緒進行控制。並可以用 getName 方法來獲得執行緒的名稱。

getName()
setName()

在指令稿執行過程中會有一個主執行緒,如果主執行緒又建立一個子執行緒,當主執行緒退出時,會檢驗子執行緒是否完成。如果子執行緒未完成,則主執行緒會等待子執行緒完成後再退出。如果想要主執行緒退出時,不管子執行緒是否完成都隨主執行緒推出,可以設定 Thread 物件的 daemon 屬性 為 True 來達到這種效果。

daemon
A boolean value indicating whether this thread is a daemon thread (True) or not (False). This must be set before start() is called, otherwise RuntimeError is raised. Its initial value is inherited from the creating thread; the main thread is not a daemon thread and therefore all threads created in the main thread default to daemon = False.
The entire Python program exits when no alive non-daemon threads are left.











沒有留言:

張貼留言