Python中有 spawn、fork、forkserver 三种创建子进程的模式

spawn 可以绕开GIL限制

  • frok 后重新启动 python 解释器 避免共享父进程不安全的资源 出现竞争的条件
  • 主动传入进程对象run方法所需的资源,子进程会拷贝一份传递进来的资源
  • 速度比 fork 或者 forkserver 模式慢
1.创建新进程:spawn命令允许在当前进程的环境中创建一个新进程。这个新进程将会和当前进程并发执行,并且可以执行不同的任务。这对于需要并行执行多个任务的应用程序来说非常有用。
2.子进程:通过spawn命令创建的新进程被称为子进程。子进程继承了父进程的一些属性,如文件描述符、信号处理器等。子进程可以继续执行父进程的任务,或者执行完全不同的任务。
3.执行外部命令:spawn命令可以用于执行外部命令。当使用spawn命令时,可以指定要执行的命令及其参数。该命令将在一个新的进程中启动,并将控制权返回给父进程。父进程可以继续执行其他任务,而不必等待子进程完成。
4.进程间通信:spawn命令还可以用于进程间通信。它可以创建一个管道,允许父进程与子进程之间进行双向通信。这对于需要在多个并发进程之间传递数据的应用程序非常有用。
5.错误处理:spawn命令还提供了错误处理功能。它可以捕获子进程执行过程中的错误,并将其返回给父进程。父进程可以根据这些错误信息采取适当的措施,如重新启动子进程或报告错误。

经典的frok 模式

  • 除了必要的启动资源外,其他变量,包,数据等都继承自父进程,并且是copy-on-write的,
  • 共享了父进程的一些内存页,因此启动较快,但是由于大部分都用的父进程数据,所以是不安全的进程
vfork( )
vfork 与 fork 最大的区别是:子进程与父进程共享相同的内存空间。
子进程对所有变量的操作,都会直接影响父进程——而这也就是很多人忌惮 vfork 的原因。
为了避免这样的操作,vfork 有一个额外的与 fork 的不同:

  vfork 之后得到的子进程,可以保证在调用 exit 或者 exec 系列调用之前,父进程都不会被执行。
  这是一个非常重要的特性,上述的两个特性,也就引出了 vfork 的应用场景
   shell 调用
   跨进程计数
  fork会将父进程的地址空间复制一份,,但是vfork并不是这么做,而是 vfork 之后的子进程,在调用 exec 或 exit 之前,在父进程的空间中执行
  exec并不是创建进程,只是用新程序替换了当前进程的上下文
  因此,执行了vfork之后,子进程请立即执行 exec,而不要再执行一次 fork,否则就可能导致死锁。或者这么说,如果在exec或exit之前依赖于父进程的进一步动作,就会导致死锁
  system是基于fork实现的,调用后父子进程调用顺序不一定,可能导致system()调用死锁

frokserver 比较新模式

  • 为了避免 fork 不安全的问题, 使用server 进程来fork 出来子进程
  • forkserver 是在 Unix 平台上的一种相对较新的模式。
  • 当需要创建子进程时,主进程会通过与服务器进程通信的方式来请求创建新的子进程。
  • 解决 fork 模式在多线程环境下可能出现的竞争条件问题,因为每个子进程都由独立的服务器进程来处理。
posted @ 2024-08-07 10:01  vx_guanchaoguo0  阅读(91)  评论(0编辑  收藏  举报