栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

并发未来是GIL的药物吗?

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

并发未来是GIL的药物吗?

不,

concurrent.futures
与GIL几乎没有任何关系。

对于GIL,使用进程而不是线程是良药。(当然,与所有药物一样,它也有副作用。但是它可以起作用。)

futures
与使用
threading
multiprocessing
直接使用模块相比,该模块仅提供了一种更简单的计划和等待任务的方式。而且它还具有一个额外的优点,即您可以在线程池和进程池(甚至可能是greenlet循环,或者您发明并构建的疯狂的东西)之间进行交换而无需更改
future
代码。因此,如果您不知道代码是否会遇到GIL问题,则可以将其构建为使用线程,然后将其切换为使用经过单行更改的进程,这非常好。

但是,如果使用

ThreadPoolExecutor
,它将与使用
threading
和手动创建线程池,任务队列等完全相同的GIL问题
queue
。如果使用
ProcessPoolExecutor
,它将以与
multiprocessing
手动使用相同的方式(并具有相同的权衡)避免GIL问题。

PyPI软件包只是该

concurrent.futures
模块从3.2到2.x(以及3.0-3.1)的简单反向移植。(它并没有神奇地为您提供经过改进的新的3.2
GIL,或者经过改进的3.3 GIL,更不用说删除GIL了。)


我什至不应该提到GIL的更改,因为这似乎增加了混乱……但是现在,让我尝试通过过度简化来理顺它。

如果除了IO绑定工作之外什么都没有,那么线程是获取并发性的一个好方法,可以达到合理的限制。3.3确实使它们更好地工作-
但是在大多数情况下,2.7已经足够好了,而在大多数情况下,2.7仍然不够好。如果你要处理10000个并发客户端,你将要使用的事件循环(例如

twisted
tornado
gevent
tulip
,等),而不是线程。

如果您有任何CPU限制的工作,线程将根本无法并行化该工作。实际上,它们使情况变得更糟。3.3使该惩罚不那么糟糕,但这仍然是一种惩罚,您仍然不应该这样做。如果要并行化CPU工作,则必须使用进程,而不是线程。3.3的唯一优点是

futures
比容易使用
multiprocessing
,并且是内置的,而不需要安装它。

我不想阻止您升级到3.3,因为它比2.7更好地实现了更好的语言。但是更好的并发并不是迁移的理由。



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

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

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