美文网首页一起学pythonPython爬虫作业
Python进程、线程、协程的对比

Python进程、线程、协程的对比

作者: chaosmind | 来源:发表于2017-06-20 11:34 被阅读953次

1. 执行过程

  • 每个线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在进程中,由进程提供多个线程执行控制。每个线程都有他自己的一组CPU寄存器,称为线程的上下文,该上下文反映了线程上次运行该线程的CPU寄存器的状态。
  • 协程,又称微线程,Coroutine。执行过程中,在子程序内部可中断,然后转而执行别的子程序,在适当的时候再返回来接着执行。实际上就是对函数调用流程的一种控制方式,让函数互相协作配合,这就是协程。

2. 调度方式

  • 进程和线程完全由操作系统负责调度,程序自己不能决定什么时候执行,执行多长时间。
  • 协程则是在程序中,自己负责调度,更加灵活,但复杂度较高。

3. 运行效率

  • 进程是重量级别的程序,创建和销毁开销大。
  • 线程是轻量级别的程序,相比进程下创建和销毁开销小,切换速度较快。
  • 协程则是单线程的异步编程模型。和多线程比,线程数量越多,CPU就会花掉更多时间在切换中,而没有线程切换、保存上下文的开销的协程,相比下运行效率则更高。第二大优势就是不需要多线程的锁机制,因为只有一个线程,也不存在同时写变量冲突,在协程中控制共享资源不加锁,所以协程性能优势更加明显。

4. CPU利用

  • 线程和协程由于CPython中全局解释器锁GIL的问题,只能使用到单核CPU的计算资源
  • 进程则可以运行多个(数量与CPU核心数相同),充分利用多核CPU

CPython解释器本身不是线程安全的,因此需要全局解释器锁GIL,一次只允许一个线程执行Python字节码。因此一个Python进程不能同时使用到多个CPU核心。
然而,标准库中所有执行阻塞型 IO 操作的函数,在等待结果返回时都会释放GIL。这意味着尽管有GIL,Python线程还是能在 IO 密集型任务中一展身手。 引用自《流畅的Python》

5. 最佳实践

  • 线程和协程推荐在IO密集型的任务(比如网络调用)中使用,而在CPU密集型的任务中,表现较差。
  • 对于CPU密集型的任务,则需要多个进程,绕开GIL的限制,利用所有可用的CPU核心,提高效率。
  • 所以大并发下的最佳实践就是多进程+协程,既充分利用多核,又充分发挥协程的高效率,可获得极高的性能。
    顺便一提,非常流行的一个爬虫框架Scrapy就是用到异步框架Twisted来进行任务的调度,这也是Scrapy框架高性能的原因之一。
参考链接

廖雪峰的Python教程
廖雪峰 协程

相关文章

  • python笔记3

    python 无线程池 ,有进程池 阻塞 意外着等待子进程结束 字典的无序性 : 进程,线程,协程 协程,又称微...

  • Gevent高并发网络库精解

    进程 线程 协程 异步 并发编程(不是并行)目前有四种方式:多进程、多线程、协程和异步。 多进程编程在python...

  • Python进程、线程、协程的对比

    1. 执行过程 每个线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在进程中,...

  • Python 高级 7

    迭代、迭代器、生成器、协程、yield、greenlet、gevent、进程线程协程对比、gevent多任务图片下...

  • Python-02进阶-04多进程多线程

    Python 进阶-04 进程线程协程并发等.md tags: Python 多进程 并发 进阶 必备知识 201...

  • python多线程、多进程、协程的使用

    python多线程、多进程、协程的使用 本文主要介绍多线程、多进程、协程的最常见使用,每个的详细说明与介绍有时间会...

  • python进程线程及协程对比

    多任务:同一时间执行多个任务 表现: 并发在一段时间内交替执行多个任务单核计算机都是并发,只是交叉时间很短,所以被...

  • 进程、线程、协程对比

    1.进程是资源分配的单位 2.线程是操作系统调度的单位 3.进程切换需要的资源很最大,效率很低 4.线程切换需要的...

  • 进程、线程、协程对比

    进程是资源分配的单位 线程是操作系统调度的单位 进程切换需要的资源很最大,效率很低 线程切换需要的资源一般,效率一...

  • 进程、线程、协程对比

    仔细理解如下的通俗描述 有一个老板想要开个工厂进行生产某件商品(例如剪子) 他需要花一些财力物力制作一条生产线,这...

网友评论

    本文标题:Python进程、线程、协程的对比

    本文链接:https://www.haomeiwen.com/subject/urtlqxtx.html