Python中的进程分支fork和exec详解


Posted in Python onApril 11, 2015

在python中,任务并发一种方式是通过进程分支来实现的.在linux系统在,通过fork()方法来实现进程分支.

1.fork()调用后会创建一个新的子进程,这个子进程是原父进程的副本.子进程可以独立父进程外运行.
2.fork()是一个很特殊的方法,一次调用,两次返回.
3.fork()它会返回2个值,一个值为0,表示在子进程返回;另外一个值为非0,表示在父进程中返回子进程ID.

以下只能在linux中运行,不能在window下运行.

进程分支fork()

实例如下:

#!/usr/bin/python

#coding=utf-8

import os
def child():

    print('hello from child', os.getpid())

    os._exit(0)

def parent():

    pid = os.fork()

    if pid == 0:

        child()

        print 'fork child process error!'#如果打印该字符串,说明调用child()出错

    else:

        print('hello from parent', os.getpid(), pid)
parent()

运行结果如下:

('hello from parent', 29888, 29889)

('hello from child', 29889)

从结果不难看出, child()后的print字符并没有打印处理,说明调用child()是没有返回的.

fork和exec的组合

从上面的例子来看,调用child()方法后就直接退出了.但在实际的应用中,我们希望分支出来的子进程能独立运行另外一个新的程序.这时需要用到exec方法替换子进程,并且替换后进程的pid不会改变.exec方法不会返回.

首先解释一下exec相关的8个方法组:

os.execv(program, cmdargs)

基本的”v”执行形式,需要传入可执行的程序名,以及用来运行程序的命令行参数字符的列表或元组.

os.execl(program, cmdarg1, cmdarg2, …, cmdargN)

基本的”l”执行形式,需要传入可执行的程序名,以及用来运行程序的命令行多个字符参数.

os.execvp(program, args)

“p”模式下,基本的”v”执行形式,需要传入可执行的程序名,以及用来运行程序的命令行参数字符的列表或元组.运行新程序的搜索路径为当前文件的搜索路径.

os.execlp(program, cmdarg1, cmdarg2, …, cmdargN)

“p”模式下,基本的”l”执行形式,需要传入可执行的程序名,以及用来运行程序的命令行多个字符参数.运行新程序的搜索路径为当前文件的搜索路径.

os.execve(program, args, env)

“e”模式下,基本的”v”执行形式,需要传入可执行的程序名,以及用来运行程序的命令行参数字符的列表或元组.最后还要传入运行新程序的需要的环境变量env字典参数.

os.execle(program, cmdarg1, cmdarg2, …, cmdargN, env)

“e”模式下,基本的”l”执行形式,需要传入可执行的程序名,以及用来运行程序的命令行多个字符参数.最后还要传入运行新程序的需要的环境变量env字典参数.

os.execvpe(program, args, env)

在”p”和”e”的组合模式下,基本的”v”执行形式,需要传入可执行的程序名,以及用来运行程序的命令行参数字符的列表或元组.最后还要传入运行新程序的需要的环境变量env字典参数.运行新程序的搜索路径为当前文件的搜索路径.

os.execlpe(program, cmdarg1, cmdarg2, …, cmdargN, env)

在”p”和”e”的组合模式下,基本的”l”执行形式,需要传入可执行的程序名,以及用来运行程序的命令行多个字符参数.最后还要传入运行新程序的需要的环境变量env字典参数.运行新程序的搜索路径为当前文件的搜索路径.

newprocess.py代码如下:

#!/usr/bin/python

#coding=utf-8

import os
def child():

    print('hello from child', os.getpid())

    os._exit(0)
child()

主代码如下:

#!/usr/bin/python

#coding=utf-8

import os
def child():

    print('hello from child', os.getpid())

    os._exit(0)
def parent():

    pid = os.fork()

    if pid == 0:

        os.execlp('python', 'python', 'newprocess.py')

        assert False, 'fork child process error!'

    else:

        print('hello from parent', os.getpid(), pid)

parent()

输出如下:
$ python TestFork.py 

('hello from parent', 30791, 30792)

$ ('hello from child', 30792)
Python 相关文章推荐
python读写ini文件示例(python读写文件)
Mar 25 Python
python删除列表中重复记录的方法
Apr 28 Python
Python实现截屏的函数
Jul 26 Python
git使用.gitignore设置不生效或不起作用问题的解决方法
Jun 01 Python
ubuntu16.04制作vim和python3的开发环境
Sep 23 Python
python实现n个数中选出m个数的方法
Nov 13 Python
python pygame模块编写飞机大战
Nov 20 Python
Python Django给admin添加Action的方法实例详解
Apr 29 Python
PyQt QListWidget修改列表项item的行高方法
Jun 20 Python
python求最大公约数和最小公倍数的简单方法
Feb 13 Python
python 线性回归分析模型检验标准--拟合优度详解
Feb 24 Python
keras中的History对象用法
Jun 19 Python
Python json模块使用实例
Apr 11 #Python
Python进程通信之匿名管道实例讲解
Apr 11 #Python
Python multiprocessing模块中的Pipe管道使用实例
Apr 11 #Python
Python httplib模块使用实例
Apr 11 #Python
初步探究Python程序的执行原理
Apr 11 #Python
Python与shell的3种交互方式介绍
Apr 11 #Python
Python函数参数类型*、**的区别
Apr 11 #Python
You might like
如何利用php+mysql保存和输出文件
2006/10/09 PHP
木翼下载系统中说明的PHP安全配置方法
2007/06/16 PHP
PHP限制页面只能在微信自带浏览器访问的代码
2014/01/15 PHP
php实现多维数组中每个单元值(数字)翻倍的方法
2015/02/16 PHP
PHP遍历XML文档所有节点的方法
2015/03/12 PHP
php自动识别文字编码并转换为目标编码的方法
2015/08/08 PHP
YII2框架中查询生成器Query()的使用方法示例
2020/03/18 PHP
用javascript判断IE版本号简单实用且向后兼容
2013/09/11 Javascript
js带按钮的提示框可供选择示例代码
2013/09/17 Javascript
JQuery伸缩导航练习示例
2013/11/13 Javascript
js中AppendChild与insertBefore的用法详细解析
2013/12/16 Javascript
javascript实现数字+字母验证码的简单实例
2014/02/10 Javascript
JavaScript中isPrototypeOf函数作用和使用实例
2015/06/01 Javascript
JQuery给select添加/删除节点的实现代码
2016/04/26 Javascript
vue,angular,avalon这三种MVVM框架优缺点
2016/04/27 Javascript
JavaScript String 对象常用方法详解
2016/05/13 Javascript
JavaScript的new date等日期函数在safari中遇到的坑
2016/10/24 Javascript
jQuery实现动态添加tr到table的方法
2016/12/26 Javascript
js实现产品缩略图效果
2017/03/10 Javascript
angular2系列之路由转场动画的示例代码
2017/11/09 Javascript
浅谈vue项目可以从哪些方面进行优化
2018/05/05 Javascript
AngularJS自定义过滤器用法经典实例总结
2018/05/17 Javascript
layui 根据后台数据动态创建下拉框并同时默认选中的实例
2019/09/02 Javascript
[08:02]DOTA2牵红线 zhou神抱得美人归
2014/03/22 DOTA
[01:12]快闪回顾DOTA2亚洲邀请赛(DAC) 静候2018新征程开启
2018/03/11 DOTA
对Tensorflow中Device实例的生成和管理详解
2020/02/04 Python
完美解决pycharm导入自己写的py文件爆红问题
2020/02/12 Python
Pycharm配置PyQt5环境的教程
2020/04/02 Python
python3用PyPDF2解析pdf文件,用正则匹配数据方式
2020/05/12 Python
奥地利度假券的专家:we-are.travel
2019/04/10 全球购物
美国健康和保健平台:healtop
2020/07/02 全球购物
yy婚礼主持词
2014/03/14 职场文书
素质教育学习心得体会
2016/01/19 职场文书
Django基础CBV装饰器和中间件
2022/03/22 Python
Python如何快速找到多个字典中的公共键(key)
2022/04/29 Python
oracle数据库去除重复数据
2022/05/20 Oracle