python多线程调用示例

python多线程调用示例,第1张

再看了网上很多大神对多线程的描述后,很多都说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就行 

 

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

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/917624.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-16
下一篇 2022-05-16

发表评论

登录后才能评论

评论列表(0条)

保存