首页 > 系统相关 >Python中有 spawn、fork、forkserver 三种创建子进程的模式

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

时间:2024-08-07 10:21:02浏览次数:15  
标签:spawn fork Python 创建 进程 执行 vfork

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 模式在多线程环境下可能出现的竞争条件问题,因为每个子进程都由独立的服务器进程来处理。

标签:spawn,fork,Python,创建,进程,执行,vfork
From: https://www.cnblogs.com/guanchaoguo/p/18346426

相关文章

  • 【数值计算方法】线性方程组迭代算法的Python实现
    线性方程组迭代算法的Python实现jacobi迭代法defJacobiIter(A:np.ndarray,b:np.ndarray,tol:float=1e-5,maxIter:int=100)->Tuple[np.ndarray,np.ndarray]:"""使用Jacobi迭代法求解线性方程组Ax=binput:......
  • Python从0到100(四十九):数据库设计及Django ORM使用
    前言:零基础学Python:Python从0到100最新最全教程。想做这件事情很久了,这次我更新了自己所写过的所有博客,汇集成了Python从0到100,共一百节课,帮助大家一个月时间里从零基础到学习Python基础语法、Python爬虫、Web开发、计算机视觉、机器学习、神经网络以及人工智能相关知......
  • Python从0到100(五十):深入理解Django ORM与事务处理
    前言:零基础学Python:Python从0到100最新最全教程。想做这件事情很久了,这次我更新了自己所写过的所有博客,汇集成了Python从0到100,共一百节课,帮助大家一个月时间里从零基础到学习Python基础语法、Python爬虫、Web开发、计算机视觉、机器学习、神经网络以及人工智能相关知......
  • python 实现FFT快速傅立叶变换算法
    FFT快速傅里叶变换介绍FFT(快速傅里叶变换)是计算离散傅里叶变换(DFT)及其逆变换的一种高效算法。DFT是一种将信号从时域转换到频域的数学工具,而FFT通过减少计算量来加速这一过程。FFT的基本思想FFT利用了DFT中的对称性和周期性,通过分而治之的策略将DFT分解为更小的DFT,从而显......
  • 8 Python字符串与二进制文本相互转换
     欢迎来到@一夜看尽长安花博客,您的点赞和收藏是我持续发文的动力对于文章中出现的任何错误请大家批评指出,一定及时修改。有任何想要讨论的问题可联系我:[email protected]。发布文章的风格因专栏而异,均自成体系,不足之处请大家指正。   专栏:java全栈C&C++PythonAIP......
  • 7 Python之代码类型提示(Type Hint)
     欢迎来到@一夜看尽长安花博客,您的点赞和收藏是我持续发文的动力对于文章中出现的任何错误请大家批评指出,一定及时修改。有任何想要讨论的问题可联系我:[email protected]。发布文章的风格因专栏而异,均自成体系,不足之处请大家指正。   专栏:java全栈C&C++PythonAIP......
  • Python 内联函数最佳实践
    如果我有一个可以用一行表示的python函数,那么以下哪一个选项通常被认为最适合可读性和一般最佳实践?或者还有其他更好的选择吗?选项2对我来说似乎是最好的,但我是初学者,所以我不想假设任何事情。我尝试过搜索PEP8、StackOverflow和一两个博客,但我找不到任何关于python的明......
  • 在Python中抽象出具有相同接口的真实硬件和模拟设备
    我正在寻找一种更惯用或更简洁的OOP模式来实现与以下内容等效的功能。接口和实现fromabcimportABC,abstractmethodfromtypingimportoverrideclassDevice:"""Maininterfacethathideswhetherthedeviceisarealhardwaredeviceorasimulated......
  • Python Django,使用外部MSSQL数据库
    我正在尝试创建一个连接到外部MSSQL数据库以仅检索信息(只读)的django网站。这个数据库非常庞大,有数百个表。我目前可以通过在django应用程序中创建一个函数来使其工作,该函数使用connectionString并运行原始SQL查询并将其返回到pandas数据帧中。不知何故,我感觉......
  • 使用 Python 中的 Matplotlib 和时间序列索引生成奇怪的图
    我正在尝试使用Python中的Matplotlib绘制一些时间序列数据,但生成的图看起来很奇怪,我不明白为什么。这是我正在使用的代码:filtered_df=df.loc[(df.index>'2010-01-01')&(df.index<='2010-01-08')]#Plottingthedatafig,axs=plt.subplots(1,1,figsize=(12,......