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)