栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

python多线程调用示例

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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就行 

 

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/878120.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号