Python多线程
python多线程机制
python的多线程是基于时间片段的轮转和GIL锁实现的, 所以python并不存在真正意义上的多线程. 因此只适用于在IO密集型的程序中使用, 对于计算密集型的程序,由于锁的竞争机制,多线程不仅不会提高效率,还会导致效率降低, 甚至卡死. 如果硬件允许的情况下,可以选择使用多进程.
python的多线程模块threading 当中有个join()方法, 叫做自旋锁, 是更高级的锁. 在多线程创建并开启之后调用. 会导致主线程阻塞但是需要注意: 在只开启一个子线程的时候调用join(), 子线程结束之后主线程继续执行, 多线程不发挥作用.当有多个子线程调用join()的时候, 多个子线程之间会自动将进行切换. 所有子线程结束之后主线程继续.
DEMO
# coding: utf-8
from time import time, sleep
from threading import Thread
t_list = []
def tf(s):
tt = time()
sleep(s)
print(tt)
if __name__ == '__main__':
for i in range(3):
t = Thread(target=tf, args=(3,))
t_list.append(t)
for t in t_list:
t.start()
for t in t_list:
t.join()
线程池的使用
from time import sleep
from concurrent.futures import ThreadPoolExecutor
def work(x, y):
sleep(3)
print(x+y)
return x + y
if __name__ == '__main__':
pool = ThreadPoolExecutor(3)
pool.map(work, range(100), range(100))
# 阻塞主进程
pool.shutdown()
print("finished")
注意: 在使用线程池的时候, 如果线程数比较多, 不建议使用map+生成器传参, 由于生成器需要逐条计算数据, 所以效率会有所下降, 而且可能会出现死锁.