python真正多线程调用示例+采坑

再看了网上很多大神对多线程的描述后,很多都说Python实现不了真正的多线程,起初我在使用过程中,对调用的时间进行打印,也感觉像是串行操作,不是并行操作:

class ThreadTest(threading.Thread):

    def __init__(self, num, *args, **kwargs):
        super(ThreadTest, self).__init__(*args, **kwargs)
        self.num = num
        print(num)

    def run(self):
        print(self.num)
        print(time.time())

if __name__ == "__main__":
    for i in range(3):
        ThreadTest(i).run()

跑出来的结果感觉像是并行的,那是因为里面没有阻塞流程的操作,每一个流程都是相同的时间等待

但如果在run里面增加一个时间等待,我们跑的时候再看下结果

立马就显示出,这种方式调用的本质其实还是串行,也就是网上说的Python在使用多线程的时候是有一个全局解释锁(GIL):

在此引用知乎上一个人溪亭日暮的评论:

 GIL 全局解释器锁: GIL(全局解释器锁,GIL 只有cpython有):在同一个时刻,只能有一个线程在一个cpu上执行字节码,没法像c和Java一样将多个线程映射到多个CPU上执行,但是GIL会根据执行的字节码行数(为了让各个线程能够平均利用CPU时间,python会计算当前已执行的微代码数量,达到一定阈值后就强制释放GIL)和时间片以及遇到IO操作的时候主动释放锁,让其他字节码执行。说白了GIL就是伪多线程,一个线程运行其他线程阻塞,使你的多线程代码不是同时执行,而是交替执行。

 python的多线程:由于GIL的原因,一个CPU同一个时刻只能执行一个线程,但是当遇到IO操作或者运行一定的代码量的时候就会释放全局解释器锁,执行另外一个线程。多线程能够有效提升I/O阻塞型程序的效率;与进程相比,占用的系统资源少;线程间能够共享资源,方便进行通信。python的多线程通过threading实现。

:进程几乎可以完成线程能够完成的任何事情。与之不同的是,一个进程里面,包含一个主线程,还可以生成很多子线程。如果有需要的话,可以将它们组成多线程。多进程能够.更好地利用多核处理器;.在处理CPU密集型任务时比多线程要好;可以通过多进程来避免全局解释器锁(GIL)的局限;崩溃的进程不会导致整个程序的崩溃。python中的多进程主要通过multiprocessing模块实现。

 我当时看到这个以为Python确实实现不了真正的多线程,然而在不断的搜索过程,我发现python如果单纯去调用run方法确实会按照这个他说的流程去走,但如果使用start()方法,则再结果显示中会以并发形式存在,而看到其他人的说法,但如果直接使用start()方法,如果主线程结束了,主线程不会等待子线程而会导致整个流程提前结束,所以需要一个阻塞主线程join的方法,但一般join其实是给最长的那个线程增加join就足够了:

这个就成了我们想要的效果:

但如果你调整join的位置,又变成之前的流程,可见如果默认其实就是走的这种独立跑子线程,然后阻塞主线程的操作:

当然就像刚说的只需要给时间最长的增加join就行 

 

当然大部分时候我们不知道什么线程是最长的,所以引用网上通用的写法:

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

谷隐凡二

相识便是缘,开启技术大门

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值