2017.10.2更新,坑比Python因为Global Interpreter Lock(GIL)的原因,也就是每个进程只能开启一个解释器,就算实现了多线程,但因为主进程只有一个所以只有一个解释器,多线程的内容还是顺序执行的(不要问我为什么知道,我不想回忆→_→)
解决方法是把代码改成多进程的,具体是引入multiprocessing
库,把下面代码中用到threading的地方改成Process,代码懒得贴了。
直接放代码了,解释见注释。
import threading
mutex_w = threading.Lock() # 创建锁
# 定义每个线程需要完成的工作
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 # 定义线程数
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)