莫愁前路,一文读懂语料预处理
近年来,随着云计算的快速发展以及5G建设的全面启动,“云网融合”成为业内开始关注的焦点。尤其是2020年,国家把“新基建”作为战略发展方向,云网融合成为新基建时代的重要实践,自然而言也就变的更加瞩目。
毫不夸张的讲,当下,人人都在谈论云网融合,运营商与各大云服务商也都把其提升到一定的战略高度,开始不断进行云网融合的相关实践。这其中,运营商对云网融合更是重视,并且在很多场合都毫不吝啬的表达云网融合的重要性。 那是不是在Python中遇到并发的需求就使用多进程就万事大吉了呢?其实不然,软件工程中有一句名言:没有银弹! 何时用?常见的应用场景不外乎三种:
CPU密集型的情况可以对比以上multiprocessing和threading的例子,多进程的性能 > 多线程的性能。 下面主要解释一下I/O密集型的情况。与I/O设备交互,目前最常用的解决方案就是DMA。 什么是DMA DMA(Direct Memory Access)是系统中的一个特殊设备,它可以协调完成内存到设备间的数据传输,中间过程不需要CPU介入。 以文件写入为例:
但是,为什么多线程运行时间比多进程还要长?这与我们上面所说(线程的开销<<进程的开销)的严重不相符啊。这就是轮到Cpython(python默认的解释器)中GIL(Global Interpreter Lock,全局解释锁)登场了。 什么是GIL GIL来源于Python设计之初的考虑,为了数据安全(由于内存管理机制中采用引用计数)所做的决定。某个线程想要执行,必须先拿到 GIL。因此,可以把 GIL 看作是“通行证”,并且在一个 Python进程中,GIL 只有一个,拿不到通行证的线程,就不允许进入 CPU 执行。 Cpython解释器在内存管理中采用引用计数,当对象的引用次数为0时,会将对象当作垃圾进行回收。设想这样一种场景: 一个进程中含有两个线程,分别为线程0和线程1,两个线程全都引用对象a。当两个线程同时对a发生引用(并未修改,不需要使用同步性原语),就会发生同时修改对象a的引用计数器,造成计数器引用少于实质性的引用,当进行垃圾回收时,造成错误异常。因此,需要一把全局锁(即为GIL)来保证对象引用计数的正确性和安全性。
无论是单核还是多核,一个进程永远只能同时执行一个线程(拿到 GIL 的线程才能执行,如下图所示),这就是为什么在多核CPU上,Python 的多线程效率并不高的根本原因。 (编辑:南通站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |