加入收藏 | 设为首页 | 会员中心 | 我要投稿 南通站长网 (https://www.0513zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长资讯 > 外闻 > 正文

莫愁前路,一文读懂语料预处理

发布时间:2021-02-17 15:54:59 所属栏目:外闻 来源:互联网
导读:近年来,随着云计算的快速发展以及5G建设的全面启动,云网融合成为业内开始关注的焦点。尤其是2020年,国家把新基建作为战略发展方向,云网融合成为新基建时代的重要实践,自然而言也就变的更加瞩目。 毫不夸张的讲,当下,人人都在谈论云网融合,运营商与各

近年来,随着云计算的快速发展以及5G建设的全面启动,“云网融合”成为业内开始关注的焦点。尤其是2020年,国家把“新基建”作为战略发展方向,云网融合成为新基建时代的重要实践,自然而言也就变的更加瞩目。

毫不夸张的讲,当下,人人都在谈论云网融合,运营商与各大云服务商也都把其提升到一定的战略高度,开始不断进行云网融合的相关实践。这其中,运营商对云网融合更是重视,并且在很多场合都毫不吝啬的表达云网融合的重要性。

 

那是不是在Python中遇到并发的需求就使用多进程就万事大吉了呢?其实不然,软件工程中有一句名言:没有银弹!

何时用?

常见的应用场景不外乎三种:

  • CPU密集型:程序需要占用CPU进行大量的运算和数据处理;
  • I/O密集型:程序中需要频繁的进行I/O操作;例如网络中socket数据传输和读取等;
  • CPU密集+I/O密集:以上两种的结合

CPU密集型的情况可以对比以上multiprocessing和threading的例子,多进程的性能 > 多线程的性能。

下面主要解释一下I/O密集型的情况。与I/O设备交互,目前最常用的解决方案就是DMA。

什么是DMA

DMA(Direct Memory Access)是系统中的一个特殊设备,它可以协调完成内存到设备间的数据传输,中间过程不需要CPU介入。

以文件写入为例:

  • 进程p1发出数据写入磁盘文件的请求
  • CPU处理写入请求,通过编程告诉DMA引擎数据在内存的位置,要写入数据的大小以及目标设备等信息
  • CPU处理其他进程p2的请求,DMA负责将内存数据写入到设备中
  • DMA完成数据传输,中断CPU
  • CPU从p2上下文切换到p1,继续执行p1


但是,为什么多线程运行时间比多进程还要长?这与我们上面所说(线程的开销<<进程的开销)的严重不相符啊。这就是轮到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 的多线程效率并不高的根本原因。



(编辑:南通站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读