当前位置:首页 » 编程语言 » python多线程是假的

python多线程是假的

发布时间: 2022-05-24 17:58:47

❶ 为什么说python没有真正意义上的多线程

因为python解释器同一个时间只能使用一个cpu,所以再多的线程还是使用同一个cpu
真正的多线程是充分利用多个cpu的计算能力的

❷ 为什么有人说Python的多线程是鸡肋

因为python的全局解释器锁的机制,
导致python的多线程并不是真正的多线程,
效率上不仅不会比单线程快,反而可能更慢,
所以说是鸡肋,要求速度好话,可以用多进程来实现

❸ Python多线程是什么意思

简单地说就是作为可能是仅有的支持多线程的解释型语言(perl的多线程是残疾,PHP没有多线程),Python的多线程是有compromise的,在任意时间只有一个Python解释器在解释Python bytecode。
UPDATE:如评论指出,Ruby也是有thread支持的,而且至少Ruby MRI是有GIL的。
如果你的代码是CPU密集型,多个线程的代码很有可能是线性执行的。所以这种情况下多线程是鸡肋,效率可能还不如单线程因为有context switch
但是:如果你的代码是IO密集型,多线程可以明显提高效率。例如制作爬虫(我就不明白为什么Python总和爬虫联系在一起…不过也只想起来这个例子…),绝大多数时间爬虫是在等待socket返回数据。这个时候C代码里是有release GIL的,最终结果是某个线程等待IO的时候其他线程可以继续执行。
反过来讲:你就不应该用Python写CPU密集型的代码…效率摆在那里…
如果确实需要在CPU密集型的代码里用concurrent,就去用multiprocessing库。这个库是基于multi process实现了类multi thread的API接口,并且用pickle部分地实现了变量共享。
再加一条,如果你不知道你的代码到底算CPU密集型还是IO密集型,教你个方法:
multiprocessing这个mole有一个mmy的sub mole,它是基于multithread实现了multiprocessing的API。
假设你使用的是multiprocessing的Pool,是使用多进程实现了concurrency
from multiprocessing import Pool
如果把这个代码改成下面这样,就变成多线程实现concurrency
from multiprocessing.mmy import Pool
两种方式都跑一下,哪个速度快用哪个就行了。
UPDATE:
刚刚才发现concurrent.futures这个东西,包含ThreadPoolExecutor和ProcessPoolExecutor,可能比multiprocessing更简单

❹ 为什么有人说 Python 的多线程是鸡肋

因为 Python 中臭名昭着的 GIL。

那么 GIL 是什么?为什么会有 GIL?多线程真的是鸡肋吗? GIL 可以去掉吗?带着这些问题,我们一起往下看,同时需要你有一点点耐心。

多线程是不是鸡肋,我们先做个实验,实验非常简单,就是将数字 “1亿” 递减,减到 0 程序就终止,这个任务如果我们使用单线程来执行,完成时间会是多少?使用多线程又会是多少?show me the code

那么把 GIL 去掉可行吗?

还真有人这么干多,但是结果令人失望,在1999年Greg Stein 和Mark Hammond 两位哥们就创建了一个去掉 GIL 的 Python 分支,在所有可变数据结构上把 GIL 替换为更为细粒度的锁。然而,做过了基准测试之后,去掉GIL的 Python 在单线程条件下执行效率将近慢了2倍。

Python之父表示:基于以上的考虑,去掉GIL没有太大的价值而不必花太多精力。

❺ python的多线程是真的多线程吗

简单地说就是作为可能是仅有的支持多线程的解释型语言(perl的多线程是残疾,PHP没有多线程),Python的多线程是有compromise的,在任意时间只有一个Python解释器在解释Python bytecode。

UPDATE:如评论指出,Ruby也是有thread支持的,而且至少Ruby MRI是有GIL的。
如果你的代码是CPU密集型,多个线程的代码很有可能是线性执行的。所以这种情况下多线程是鸡肋,效率可能还不如单线程因为有context switch
但是:如果你的代码是IO密集型,多线程可以明显提高效率。例如制作爬虫(我就不明白为什么Python总和爬虫联系在一起…不过也只想起来这个例子…),绝大多数时间爬虫是在等待socket返回数据。这个时候C代码里是有release GIL的,最终结果是某个线程等待IO的时候其他线程可以继续执行。
反过来讲:你就不应该用Python写CPU密集型的代码…效率摆在那里…
如果确实需要在CPU密集型的代码里用concurrent,就去用multiprocessing库。这个库是基于multi process实现了类multi thread的API接口,并且用pickle部分地实现了变量共享。
再加一条,如果你不知道你的代码到底算CPU密集型还是IO密集型,教你个方法:
multiprocessing这个mole有一个mmy的sub mole,它是基于multithread实现了multiprocessing的API。
假设你使用的是multiprocessing的Pool,是使用多进程实现了concurrency

from multiprocessing import Pool

如果把这个代码改成下面这样,就变成多线程实现concurrency

from multiprocessing.mmy import Pool

两种方式都跑一下,哪个速度快用哪个就行了。

UPDATE:
刚刚才发现concurrent.futures这个东西,包含ThreadPoolExecutor和ProcessPoolExecutor,可能比multiprocessing更简单

❻ 为什么有人说 Python 的多线程是鸡肋呢

首先,我并不认同这个观点,我觉得觉得Python 的多线程是鸡肋多余的人,应该还没有完全使用过Python 的多线程功能,并没有发掘它的潜在能力。

  • 什么是Python多线程

Python多线程最大的优点就是使用方便,很多时候我们并不需要做大量的密集型数据的处理运算,这时候用Python多线程是最方便快捷的,可以大大减少工作量、提高工作效率。

  • 总结

从以上几点我们就可以看出,Python多线程并不鸡肋,只是有时候使用者在不巧当的地方使用,它自然不是那么顺手,我们加深熟悉了解Python多线程的适用范围。

❼ python的多线程是假的吗

对 是假的 有全局锁

❽ python的多线程到底有没有用

线程主要用于异步操作。只要有异步的IO,或者是异步的操作,等待都可以用线程。

但是python的线程不足够安全。同时它还有GIL的问题。线程的退出也不太容易。所以在python里经常用进程代替线程。但是如果并发内容太多,只能用多进程+多线程方式。

总体来讲。只要用法正确。python的线程还是很可靠的。起动和完成几万次线程。一次不出错,也是有可能的。

典型的用法是,在GUI后面,做一些后台操作;多线程网络操作;后台监控某个事件;队列操作等 。

❾ py的多线程是伪线程吗

这是一个很难回答的问题。倒不是因为技术问题,而是这个问题本身的很多含义很含糊。Python的线程有两层意思。第一是对Python解释器来说。这个没问题,是真线程。Python的解释器会管理它名下的线程,分配资源,并行运行。而Python的这些线程针对OS是否是多线程的?这个不是。Python的线程只能通过Python解释器得到系统资源。而Python本身,是单线程模式的。因此Python的线程不可能是真的线程。第三个问题,既然Python的线程不是真线程,是否编程的时候要避免使用?这个,见仁见智。我个人的偏好是,不用。虽说多线程在某些情况下能简化程序的设计,但是这种情况太少见了。

❿ 为什么有人说 Python 的多线程是鸡肋呢

由于python是一种解释性脚本语言,因此运行过程中始终存在全局线程锁。
简单的来说就是在实际的运行过程中,python只能利用一个线程,因此python的多线程并不达到C语言多线程的性能。

建议使用多进程来代替多线程,但需要注意的是多进程最好不要涉及到例如文件操作的频繁操作IO的功能。

热点内容
phpparent的parent 发布:2025-02-13 04:18:08 浏览:450
小容量存储器市场 发布:2025-02-13 04:01:11 浏览:370
ickeck文件夹 发布:2025-02-13 04:00:21 浏览:639
上传照片文案 发布:2025-02-13 03:53:13 浏览:425
电脑版花雨庭怎么调中文服务器 发布:2025-02-13 03:32:35 浏览:37
linux开发android 发布:2025-02-13 03:32:34 浏览:486
查询重复字段的sql语句 发布:2025-02-13 03:12:42 浏览:323
8uftp上传网站 发布:2025-02-13 03:01:57 浏览:243
电脑玩游戏如何配置电源 发布:2025-02-13 03:01:53 浏览:362
微信怎么上传头像不了 发布:2025-02-13 02:57:04 浏览:119