风火编程--python多线程

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+生成器传参, 由于生成器需要逐条计算数据, 所以效率会有所下降, 而且可能会出现死锁.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值