并发编程(三)

1、多线程

  1.1、GIL(Global Interpreter Lock)全局解释器锁

    其他语言,CPU是多核时,是支持多个线程同时执行,但在python中,无论是单核还是多核,在任意时刻只能有一个线程在执行。其根源是GIL的存在。

GIL:来源是python设计之初,为了数据安全所做的决定。某个线程想要执行,必须先拿到GIL看作是“通行证”,并且在一个python进程中,GIL中只有一个,拿不到GIL的线程,无法进入CPU执行

  1.2、目前的python解释器:

    (1)、CPython:CPython是用C语言实现的Python解释器。 作为官方实现,它是最广泛使用的Python解释器。

    (2)、PyPy:PyPy是用RPython实现的解释器。RPython是Python的子集, 具有静态类型。这个解释器的特点是即时编译,支持多重后端(C, CLI, JVM)。PyPy旨在提高性能,同时保持最大兼容性(参考CPython的实现)。

    (3)、Jython:Jython是一个将Python代码编译成Java字节码的实现,运行在JVM (Java Virtual Machine) 上。另外,它可以像是用Python模块一样,导入并使用任何Java类。

    (4)、IronPython:IronPython是一个针对 .NET 框架的Python实现。它可以用Python和 .NET framework的库,也能将Python代码暴露给 .NET框架中的其他语言。

    GIL只在CPython中才有,而在PyPy和Jython中是没有GIL的。

    由于GIL锁存在,Python里一个进程永远只能同时执行一个线程(拿到GIL的线程才能执行),这就是为什么在多核CPU上,Python 的多线程效率并不高的根本原因

 

2、多进程

  Python要进行多进程操作,需要用到muiltprocessing库,其中的Process类跟threading模块的Thread类很相似。

 

3、多线程和多进程的应用场景

  要看程序属于哪种类型,一般分为:CPU密集型、I/O密集型

  3.1、CPU密集型:程序比较偏重于计算,需要经常使用CPU来运算。例如科学计算的程序,机器学习的程序等。

  3.2、I/O密集型:顾名思义就是程序需要频繁进行输入输出操作。爬虫程序就是典型的I/O密集型程序。

 

  如果程序是属于CPU密集型,建议使用多进程;    而多线程就更适合应用于I/O密集型程序。

 

posted on 2023-04-01 14:27  默玖  阅读(13)  评论(0编辑  收藏  举报

导航