python 进程 线程 协程

  并发与并行:并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔内发生。在单核CPU下的多线程其实都只是并发,不是并行。

  进程是系统资源分配的最小单位,进程的出现是为了更好的利用CPU资源使到并发成为可能。进程由操作系统调度。

  线程的出现是为了降低上下文切换的消耗,提高系统的并发性,并突破一个进程只能干一样事的缺陷,使到进程内并发成为可能。线程共享进程的大部分资源,并参与CPU的调度, 当然线程自己也是拥有自己的资源的,例如,栈,寄存器等等。线程由操作系统调度。

  协程通过在线程中实现调度,避免了陷入内核级别的上下文切换造成的性能损失,进而突破了线程在IO上的性能瓶颈。协程由代码调度。

  多个线程相对独立,有自己的上下文,切换受系统控制;而协程也相对独立,有自己的上下文,但是其切换由自己控制,由当前协程切换到其他协程由当前协程来控制。

  线程,在计算机里面通常的分类是内核级线程和用户级线程。内核级线程的调度是由系统完成的,而用户级线程的调度是由用户来控制的。那么Python标准库提供的线程是那一类呢?如果我们了解或者使用过gevent和eventlet,进行下对比,我们就很容易回答出来了。Python提供的线程是内核级的,而gevent和eventlet提供的则是用户级的线程。这类用户级的线程,我们叫它协程,也可以叫green thread。

  GIL锁是对于解释器的,它保证一个进程同一时刻只存在一个解释器实例,并不是说Python 不能利用多核,而是不能“有效”利用多核。一个进程的多个线程运行在多核上的时候,解释器仍有可能被某一线程阻塞导致其它线程的代码无法执行。移除GIL锁是没有必要的,会给多线程编程造成巨大的心智负担。要想充分利用多核,可以使用多进程+协程的方式,多进程下不存在GIL锁的问题,而协程的系统开销远比线程小所以理论上来说性能更优,协程可以轻松的达到十万甚至百万并发的级别,而子线程到达这个量级的时候调度开销会比较大。从Python3加入的新特性asyncio可以知道,python官方也认为与其解决GIL锁对多线程编程造成的困扰,不如转而鼓励使用语言级别的协程。虽然具体实现上有差别,然而Golang,Javascript也是采用类似的方式解决异步的问题的。

   uwsgi可以配置参数启动多个进程,还可以配置一个进程有多个线程。eventlet则是开启多个协程。

   进程间通信的方法有:消息队列(redis、mongoDB等)、管道、共享内存、信号

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; line-height: 19.0px; font: 13.0px "Helvetica Neue" }

原文地址:https://www.cnblogs.com/luozx207/p/10011680.html

时间: 2024-10-25 04:34:31

python 进程 线程 协程的相关文章

python 进程/线程/协程 测试

# Author: yeshengbao # -- coding: utf-8 -- # @Time : 2018/5/24 21:38 # 进程:如一个人拥有分身(分数数最好为cpu核心数)几乎同时进行做工# 线程:如这个人正在烧开水,但同时又可以在烧水时间内去吃饭,和扫地,这时线程就会对其随机选择,可能还会出现地还没扫完,水就开了,但他还会扫地{这就可能出现数据丢失}..# 协程:这个一个比线程更小的线程非常相似,但他在执行任务时,已经被规划好了,不会就行额外的时间浪费,创建时更省资源 im

python进程|线程|协程

进程(Process) 1)进程就是正在运行的程序,它是操作系统中,资源分配的最小单位 (1)资源分配:分配的是cpu和内存等物理资源 (2)进程号是进程的唯一标识 2)同一个程序执行两次之后是两个进程 3)进程和进程之间的关系: 数据彼此隔离,通过socket通信 获取进程id import os res = os.getpid() # 获取当前进行id (当前子进程) print(res) res = os.getppid() # 获取父进程id print(res) # result "&

# 进程/线程/协程 # IO:同步/异步/阻塞/非阻塞 # greenlet gevent # 事件驱动与异步IO # Select\Poll\Epoll异步IO 以及selectors模块 # Python队列/RabbitMQ队列

1 # 进程/线程/协程 2 # IO:同步/异步/阻塞/非阻塞 3 # greenlet gevent 4 # 事件驱动与异步IO 5 # Select\Poll\Epoll异步IO 以及selectors模块 6 # Python队列/RabbitMQ队列 7 8 ############################################################################################## 9 1.什么是进程?进程和程序之间有什么

初识进程 线程 协程(三):协程

协程:(又称微线程,也是交替运行) 进程-->线程-->协程 协程就是充分利用cpu给该线程的时间,多个协程只使用一个线程,某个任务遇到阻塞,执行下一个任务.如果一个线程只执行一个任务,比较容易进入阻塞队列,如果这条线程永远在工作(协程:一个线程执行多个任务),永远不会进入阻塞队列. 适用场景:    当程序中存在大量不需要CPU的操作时(IO) 特点: 每次都能从上次暂停的位置继续执行 三种实现方式: 1.yield(生成器) 生成器:一边计算一边循环的机制 def a(): ......

python的进程/线程/协程

1.python的多线程 多线程就是在同一时刻执行多个不同的程序,然而python中的多线程并不能真正的实现并行,这是由于cpython解释器中的GIL(全局解释器锁)捣的鬼,这把锁保证了同一时刻只有一个线程被执行. 多线程的特点: 线程比进程更轻量级,创建一个线程要比创建一个进程快10-100倍. 线程共享全局变量. 由于GIL的原因,当一个线程遇到IO操作时,会切换到另一个线程,所以线程适合IO密集型操作. 在多核cpu系统中,最大限度的利用多核,可以开启多个线程,开销比进程小的多,但是这并

进程/线程/协程/GIL

线程 线程是操作系统调度的最小单位 threading模块 线程的调用方式: import threading import time '''直接调用''' def hello(name): print("Hello %s"%name) time.sleep(3) if __name__ == "__main__": t1=threading.Thread(target=hello,args=("zhangsan",)) #生成线程实例 t2=t

Python并发编程-进程 线程 协程

一.进程 进程:就是一个程序在一个数据集上的一次动态执行过程. 进程由三部分组成: 1.程序:我们编写的程序用来描述进程要完成哪些功能以及如何完成 2.数据集:数据集则是程序在执行过程中所需要使用的资源 3.进程控制块:进程控制块用来记录进程的外部特征,描述进程的执行变化过程,系统可以利用它来控制和管理进程,它是系统感 知进程存在的唯一标志. 二.线程                                                                        

进程线程协程那些事儿

一.进程与线程 1.进程 我们电脑的应用程序,都是进程,假设我们用的电脑是单核的,cpu同时只能执行一个进程.当程序出于I/O阻塞的时候,CPU如果和程序一起等待,那就太浪费了,cpu会去执行其他的程序,此时就涉及到切换,切换前要保存上一个程序运行的状态,才能恢复,所以就需要有个东西来记录这个东西,就可以引出进程的概念了. 进程就是一个程序在一个数据集上的一次动态执行过程.进程由程序,数据集,进程控制块三部分组成.程序用来描述进程哪些功能以及如何完成:数据集是程序执行过程中所使用的资源:进程控制

进程线程协程的区别

一.概念 1.进程 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.每个进程都有自己的独立内存空间,不同进程通过进程间通信来通信.由于进程比较重量,占据独立的内存,所以上下文进程间的切换开销(栈.寄存器.虚拟内存.文件句柄等)比较大,但相对比较稳定安全. 2.线程 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存