Multi-processing 和 Multi-threading 的 Differenece:
Multi-processing (多處理程序/多進程):
- 資料在彼此間傳遞變得更加複雜及花時間,因為一個 process 在作業系統的管理下是無法去存取別的 process 的 memory
- 適合需要 CPU 密集,像是迴圈計算
Multi-threading (多執行緒/多線程):
- 資料彼此傳遞簡單,因為多執行緒的 memory 之間是共用的,但也因此要避免會有 Race Condition 問題
- 適合需要 I/O 密集,像是爬蟲需要時間等待 request 回覆
- 一個執行緒被中斷會導致集體死亡
Muti-Thread Usage
threading.active_count() 用來查看目前有多少個線程
threading.enumerate() 目前使用線程的資訊
- threading.current_thread().name 可以用來查看你在哪一個執行緒當中
- threading.Thread(target=function,name='線程名字',args=參數) 用來指定你要執行哪一個function,target那邊打上你要的function,你也可以幫線程取名子,在name那邊打上即可,如果要加入參數,在args那邊打上就好
- .start()開始執行你所指定的線程,在.前面打上你線程的名字
- .join()當你接下來的要執行程式需要你子程序的資料時可以使用這個來讓程式進入暫停,直到子程序執行完畢
Muti-Thread Basic Code
import threading
class Dosomething:
def__init__(self):
self.t_list = []
def dosomething(self, i):
print('第' + str(i))
print('執行緒 ID:' + str(threading.get_ident()))
def run(self):
for i inrange(5):
self.t_list.append(
threading.Thread(target=self.dosomething, args=(str(i))))
self.t_list[i].start()
for i inself.t_list:
i.join()
if __name__ == "__main__":
d = Dosomething()
d.run()
Notes
python的多線程執行速度其實有時候並沒有更快,反而有時後是更慢的,原因在於其他程式語言中是支援多核cpu的同時執行多個線程,然而python無論在單核還是在多核裡面都是只支援單一線程的,其原因在於GIL(Global Interpreter Lock)的存在。
GIL原本的目的是為了保護數據的安全,在某個線程中如果要執行首先需要拿到GIL,如果沒有拿到就不能執行,也就是不能進入cpu中。