Python中的os.fork()详解

python中使用os模块中的fork创建新的进程

以下代码的测试版本均为python2.7.5

python运行时产生的进程

在我们运行python程序的时候,系统会生成一个新的python进程。新建一个python文件vim test.py
下面为测试代码:

# -*- coding: utf-8 -*-

import time 

time.sleep(20)

因为在python程序执行完毕后,进程会被销毁,所以这里设置休眠时间20秒,方面看到效果。在Linux下执行命令:python test.py &

在命令后面加&符号,时为了让程序在后台运行。然后输入ps -l查看进程,在终端显示如下:
这里写图片描述

使用fork方法来创建一个新进程

使用fork创建一个新的进程后,新进程是原进程的子进程,原进程为父进程。如果发生错误,则会抛出OSError异常。


# -*- coding: utf-8 -*-
import time

import os

try:
    pid = os.fork()
except OSError, e:
    pass

time.sleep(20)

运行代码,查看进程,在终端输出如下:
这里写图片描述
可以看出第二条python进程就是第一条的子进程。

fork出进程后的程序流程

使用fork创建子进程后,子进程会复制父进程的数据信息,而后程序就分两个进程继续运行后面的程序,这也是fork(分叉)名字的含义了。在子进程内,这个方法会返回0;在父进程内,这个方法会返回子进程的编号PID。
可以使用PID来区分两个进程:

# -*- coding: utf-8 -*-
import time
import os

#创建子进程前声明的变量
number = 7
try:
    pid = os.fork()

    if pid == 0:
        print "this is child process"
        number = number - 1
        time.sleep(5)
        print number
    else:
        print "this is parent process"
except OSError, e:
    pass

上面代码中,在子进程创建前,声明了一个变量number,然后在子进程中自减1,最后打印出number的值,显然父进程打印出来的值为7,子进程打印出来的值为6。为了明显区分父进程和子进程,让子进程睡3秒,这样效果就比较明显了。
这里写图片描述
既然子进程是父进程创建的,那么父进程退出之后,子进程会被PID为1的进程接管,就是init进程了。这样子进程就不会受终端退出影响了,使用这个特性就可以创建在后台执行的程序,俗称守护进程(daemon)。

  • 13
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
在Windows系统上不能直接使用`os.fork()`方法,因为该方法是基于UNIX系统的进程复制机制实现的,而Windows系统不支持这种机制。但是,可以使用Python的`multiprocessing`模块来实现类似的功能,该模块提供了一些方法来创建子进程,例如`Process`类、`Pool`类等。 下面是一个使用`multiprocessing`模块创建子进程的例子: ```python import multiprocessing def worker(): print('Child process') if __name__ == '__main__': p = multiprocessing.Process(target=worker) p.start() print('Parent process') ``` 在这个例子,我们创建了一个子进程,并在子进程打印了一行文本,然后在主进程也打印了一行文本。在启动子进程时,我们使用`multiprocessing.Process`类来创建一个进程对象,指定要执行的函数为`worker`,然后使用`start()`方法启动该进程。在`if __name__ == '__main__':`语句,我们判断当前脚本是否在主进程执行,如果是,则启动子进程;如果不是,则不执行启动子进程的代码。这是因为在Windows系统,每个进程都会执行整个脚本,如果不加这个判断,会导致子进程无限递归创建,最终导致程序崩溃。 需要注意的是,使用`multiprocessing`模块创建的进程之间是相互独立的,它们之间无法共享内存,也无法使用`os.fork()`方法实现进程间的通信。因此,在使用`multiprocessing`模块时,需要使用该模块提供的队列、管道等机制来实现进程间的数据传输和通信。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值