python中的多线程

news/2025/2/11 4:08:21/

python代码的执行是由python虚拟机进行控制的。尽管python解释器中可以运行多个线程,但是在任意给定时刻只有一个线程会被解释器执行。

python虚拟机的访问是由全局解释器锁(GIL)控制的。这个锁就是用来保证同时只能有一个线程运行的。因此,在 python中无法通过多线程来利用多个 CPU同时处理任务,以达到应用加速的目的。下面通过两个测试程序可以验证这个问题。

我的处理器有 8个核,因此在多线程测试中一共创建 8个线程来处理任务,这里的任务特指:使用递归求解斐波拉契数。

多线程版本代码:

#!/usr/bin/env pythonimport threading
from time import timedef foo(n):if n < 2:return 1return foo(n - 2) + foo(n - 1)def main():threads = []n_process = 8n = 36for i in range(0, n_process):t = threading.Thread(target=foo, args=(n,))threads.append(t)start = time()for i in range(0, n_process):threads[i].start()for i in range(0, n_process):threads[i].join()end = time()print("start: %f, end: %f, cost: %f" % (start, end, end - start))if __name__ == "__main__":main()

运行时间:

$ python3 ./python/multi_thread/main.py
start: 1687413176.686146, end: 1687413199.358464, cost: 22.672318

单线程版本代码:

#!/usr/bin/env pythonfrom time import timedef foo(n):if n < 2:return 1return foo(n - 2) + foo(n - 1)def main():n_process = 8n = 36start = time()for i in range(0, n_process):foo(n)end = time()print("start: %f, end: %f, cost: %f" % (start, end, end - start))if __name__ == "__main__":main()

运行时间:

$ python3 ./python/multi_thread/main2.py
start: 1687413202.103315, end: 1687413223.906954, cost: 21.803639

从上面的例子可以看到,由于 python虚拟机是单线程(GIL)的原因,对于计算密集型任务,多线程无法起到应用加速的目的,只有程序在执行I/O密集型的任务时才能更好地发挥 python多线程的并发行(I/O释放了GIL,可以允许更多的并发)。对于计算密集型任务,为了实现更好的并行性,需要使用多进程,以便让 CPU的其他核来同时处理任务。

参考资料:
Python核心编程:第3版 /(美)春(Chun, W.)著;孙波翔,李斌,李晗译.


http://www.ppmy.cn/news/515889.html

相关文章

Golang | Web开发之Gin静态资源映射及HTML模板渲染

欢迎关注「全栈工程师修炼指南」公众号 点击 &#x1f447; 下方卡片 即可关注我哟! 设为「星标⭐」每天带你 基础入门 到 进阶实践 再到 放弃学习&#xff01; 专注 企业运维实践、网络安全、系统运维、应用开发、物联网实战、全栈文章 等知识分享 “ 花开堪折直须折&#xf…

【C++篇】C++的动态分配内存

友情链接&#xff1a;C/C系列系统学习目录 知识点内容正确性以C Primer&#xff08;中文版第五版&#xff09;、C Primer Plus&#xff08;中文版第六版&#xff09;为标准&#xff0c;同时参考其它各类书籍、优质文章等&#xff0c;总结归纳出个人认为较有逻辑的整体框架&…

2020-06-06

这次课&#xff0c;老师让做一个四边形&#xff0c;然后&#xff0c;最终我没有做出来&#xff0c;在哪个赋值那里出了问题&#xff0c;对前面的知识有所遗忘&#xff0c;然后上课也有点走神&#xff0c;敲代码的时候也有点粗心&#xff0c;然后上课老师讲的知识也没有在课下及…

赛尔号登录器显示服务器未开启,赛尔号登录界面改版啦!

赛尔号登录界面改版啦&#xff01;赛尔号登录界面在8月19日改版啦~变得更加高端大气上档次喽~下面就让我们来一起看看这次改版以后&#xff0c;各个功能要如何使用了~大家仔细看哦~下面就进入赛尔号登录界面改版使用说明啦&#xff01; 登录4399赛尔号后&#xff0c;点击开始游…

赛尔号12点服务器维护多久,赛尔号只有真正老玩家才知道的事?光螳螂半夜12点的传言知道吗?...

2009-2011比较有纪念意义的活动/任务&#xff1a;从赛尔号初始航行开始&#xff0c;新星球出来的那一刻&#xff0c;赛尔就正式踏上了走向宇宙的征途&#xff0c;除了赛尔号主线和精灵支线&#xff0c;更吸引人的是赛尔号的那些“突发任务”。突发任务能知道一些精灵和NPC的一些…

赛尔号维护服务器要多久,网友提问:现在还有多少玩家玩赛尔号,游戏的寿命还有多久?...

赛尔号从09年开始&#xff0c;巅峰时期是2010-2011&#xff0c;这个很多玩家都清楚。是停留在雷伊、哈莫雷特、谱尼、融合精灵等等这个年代&#xff0c;留得更久一点的估计就是四人战神联盟了。后来超进化的确回归了不少玩家&#xff0c;但那也是到缪斯之后人丁再次开始稀少。精…

计算机游戏的作文,描写电脑游戏的优秀作文300字(通用3篇)

描写电脑游戏的优秀作文300字(通用3篇) 在日复一日的学习、工作或生活中&#xff0c;许多人都写过作文吧&#xff0c;作文是一种言语活动&#xff0c;具有高度的综合性和创造性。怎么写作文才能避免踩雷呢&#xff1f;以下是小编为大家收集的描写电脑游戏的优秀作文300字(通用3…

MongoDB扫盲-黑马

MongoDB从入门到入土 1、MongoDB相关的概念 1.1MongoDB适用的场景 1、数据量大 2、写入操作频繁 3、价值较低的数据&#xff0c;对事务性要求不高 1.2MongoDB简介 MongoDB是一个开源、高性能、无模式的文档型数据库&#xff0c;是NoSQL数据库产品中的一种&#xff0c;是…