Background

[Python] Run python threads on multiple cores 之前在這篇文章中有介紹在python中muti-thread and muti-process的差別&特性. 那這邊主要在介紹如何利用python來實作muti-thread的功能

Threading

在 Python 裡面有個 threading 的 module,他提供一個簡單的 Thread class 可以來讓我們產生 thread。Thread 有兩種使用方式:

Thread 是 threading 模塊中最重要的類之一,可以使用它來創建線程。有兩種方式來創建線程:一種是通過繼承Thread 類,重寫它的 run 方法;另一種是創建一個 threading.Thread 對象,在它的初始化函數(init)中將可調用對像作為參數傳入。下面分別舉例說明。先來看看通過繼承 threading.Thread 類來創建線程的例子 :

import threading
import time
count = 0

class Converter(threading.Thread):

    def __init__(self, lock, threadName):
        '''@summary:初始化對象

        @param lock: lock object
        @param threadName: 線程名稱
        '''
        super(Converter, self).__init__(name = threadName)
        self.lock = lock
        self.threadName = threadName

    def run(self):
        print(self.threadName)
        global count
        # 這邊會lock住 所以其他的thread必須等前一個跑完才能繼續
        self.lock.acquire()
        for i in range(10):
            print(self.threadName)
            count = count +  1
        self .lock.release()
    
def main():
    lock = threading.Lock()
    thread_list = list()

    for i in range(6):
        thread_list.append(Converter(lock,  "thread-"  + str(i)))

    for thd in thread_list:
        thd.start()

    # Wait for all threads to terminate
    for thd in thread_list:
        while thd.is_alive():
            time.sleep(1)

    global count
    print("total:", count)

if __name__ == "__main__":
    main()

以上是一個簡單的thread programing. 那因為thead programing最常討論的就是Race condition的問題. 所以得自己根據需求去設定lock的時機點.

Queue

Python 有一個 Queue 的 module,他內部有 locking 的機制,通常 thread 都會跟 Queue 一起搭配服用.

Python 的 Queue 有三種形式

  1. FIFO Queue
  2. LIFO Queue
  3. Priority Queue

FIFO & LIFO 我想就蠻單純的, 以前的Data Structure課程就有介紹. 這邊就不多說了. (利用 put & get function來放資料&取得資料)

Priority Queue 就比較特別了 他會保持 List 數據是排序過的, 最小值被先取出.

有關Queue & Thread 的應用可以參考下面兩篇, 我這邊就不多講了.

  1. https://pymotw.com/2/Queue/
  2. http://yu-liang.logdown.com/posts/184136/python-threading

Reference