一個比較完整的Python多線程操作的例子

2017.10.2更新,坑比Python因為Global Interpreter Lock(GIL)的原因,也就是每個進程只能開啟一個解釋器,就算實現(xiàn)了多線程,但因為主進程只有一個所以只有一個解釋器,多線程的內(nèi)容還是順序執(zhí)行的(不要問我為什么知道,我不想回憶→_→)
解決方法是把代碼改成多進程的,具體是引入multiprocessing庫,把下面代碼中用到threading的地方改成Process,代碼懶得貼了。

直接放代碼了,解釋見注釋。

import threading

mutex_w = threading.Lock()  # 創(chuàng)建鎖

# 定義每個線程需要完成的工作
def worker(seed):
    for seed in seeds:
        # 做一些不需要鎖的操作
        # 操作共享資源
        if mutex_w.acquire(1):  # 嘗試獲取鎖
            thread_name = threading.current_thread().name  # 獲取當前進程名
            print("%s starts writing the file" % thread_name)
            # 操作共享資源
            print("%s finishes writing the file" % thread_name)
            mutex_w.release()  # 釋放鎖


if __name__ == "__main__":
    # 本例中有15個線程,需要計算100次,盡可能平均得把計算任務分配給所有線程
    num_proc = 2  # 定義線程數(shù)
    seeds = [np.arange(i, 2, num_proc) for i in range(num_proc)]  # 把seed分給不同的線程進行處理

    thread_list = list()
    for i in range(num_proc):
        t = threading.Thread(target=worker, args=(seeds[i],))
        thread_list.append(t)

    # 啟動所有線程
    for t in thread_list:
        t.start()

    # 主線程中等待所有子線程退出
    for t in thread_list:
        t.join()

    # 所有子線程完成后可以做一些別的操作  
    save_results(res)
  
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容