是时候用 ES 拯救发际线啦

python并发编程之多进程

资料分享 | 作者 threeb | 发布于2021年01月20日 | 阅读数:1364

什么是进程 进程:正在进行的一个过程或者说一个任务。而负责执行任务则是cpu。

单核+多道,实现多个进程的并发执行

进程与程序的区别 程序仅仅只是一堆代码而已,而进程指的是程序的运行过程。

需要强调的是:同一个程序执行两次,那也是两个进程。

并发与并行 无论是并行还是并发,在用户看来都是'同时'运行的,不管是进程还是线程,都只是一个任务而已,真是干活的是cpu,cpu来做这些任务,而一个cpu同一时刻只能执行一个任务

并发:是伪并行,即看起来是同时运行。单个cpu+多道技术就可以实现并发,(并行也属于并发)

并行:同时运行,只有具备多个cpu才能实现并行

同步\u5f02步and阻塞\u975e阻塞 同步

所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不会返回。 按照这个定义,其实绝大多数函数都是同步调用。 但是一般而言,我们在说同步、异步的时候,特指那些需要其他部件协作或者需要一定时间完成的任务。

举例: multiprocessing.Pool下的apply 发起同步调用后,就在原地等着任务结束,根本不考虑任务是在计算还是在io阻塞 总之就是一股脑地等任务结束 异步

异步的概念和同步相对。 当一个异步功能调用发出后,调用者不能立刻得到结果。 当该异步功能完成后,通过状态、通知或回调来通知调用者。 如果异步功能用状态来通知,那么调用者就需要每隔一定时间检查一次,效率就很低。 如果是使用通知的方式,效率则很高,因为异步功能几乎不需要做额外的操作。 至于回调函数,其实和通知没太多区别。 举例: multiprocessing.Pool().apply_async() 发起异步调用后,并不会等待任务结束才返回,相反,会立即获取一个临时结果 (并不是最终的结果,可能是封装好的一个对象)。 阻塞

阻塞调用是指调用结果返回之前,当前线程会被挂起(如遇到io操作)。 函数只有在得到结果之后才会将阻塞的线程激活。 有人也许会把阻塞调用和同步调用等同起来,实际上他是不同的。 对于同步调用来说,很多时候当前线程还是激活的,只是从逻辑上当前函数没有返回而已。 举例:

同步调用:apply一个累计1亿次的任务,该调用会一直等待,直到任务返回结果为止,但并未阻塞住(即便是被抢走cpu的执行权限,那也是处于就绪态);
阻塞调用:当socket工作在阻塞模式的时候,如果没有数据的情况下调用recv函数,则当前线程就会被挂起,直到有数据为止。 非阻塞

非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前也会立刻返回,同时该函数不会阻塞当前线程。 小结

同步与异步针对的是函数/任务的调用方式: 同步就是当一个进程发起一个函数(任务)调用的时候,一直等到函数(任务)完成,而进程继续处于激活状态。 而异步情况下是当一个进程发起一个函数(任务)调用的时候,不会等函数返回, 而是继续往下执行当,函数返回的时候通过状态、通知、事件等方式通知进程任务完成。

阻塞与非阻塞针对的是进程或线程: 阻塞是当请求不能满足的时候就将进程挂起,而非阻塞则不会阻塞当前进程 进程的层次结构 无论UNIX还是windows,进程只有一个父进程,不同的是:

在UNIX中所有的进程,都是以init进程为根,组成树形结构。父子进程共同组成一个进程组,这样,当从键盘发出一个信号时,该信号被送给当前与键盘相关的进程组中的所有成员。 

在windows中,没有进程层次的概念,所有的进程都是地位相同的,唯一类似于进程层次的暗示,是在创建进程时,父进程得到一个特别的令牌(称为句柄),该句柄可以用来控制子进程,但是父进程有权把该句柄传给其他子进程,这样就没有层次了。
已邀请:

要回复问题请先登录注册