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中使用strip()方法删除字符串中空格的教程
May 20 Python
python3.6 +tkinter GUI编程 实现界面化的文本处理工具(推荐)
Dec 20 Python
numpy.std() 计算矩阵标准差的方法
Jul 11 Python
Pyqt5实现英文学习词典
Jun 24 Python
解决django服务器重启端口被占用的问题
Jul 26 Python
python代码打印100-999之间的回文数示例
Nov 24 Python
Python实现使用dir获取类的方法列表
Dec 24 Python
Python实现点云投影到平面显示
Jan 18 Python
Pytorch高阶OP操作where,gather原理
Apr 30 Python
Python-jenkins模块获取jobs的执行状态操作
May 12 Python
Python Django框架介绍之模板标签及模板的继承
May 27 Python
用python基于appium模块开发一个自动收取能量的小助手
Sep 25 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 Cookie的一个使用注意点
2008/11/08 PHP
fleaphp常用方法分页之Pager使用方法
2011/04/23 PHP
关于更改Zend Studio/Eclipse代码风格主题的介绍
2013/06/23 PHP
php解压文件代码实现php在线解压
2014/02/13 PHP
Yii的CDbCriteria查询条件用法实例
2014/12/04 PHP
判断、添加和删除WordPress置顶文章的相关PHP函数小结
2015/12/10 PHP
php采用session实现防止页面重复刷新
2015/12/24 PHP
php实现简单加入购物车功能
2017/03/07 PHP
PHP编译configure时常见错误的总结
2017/08/17 PHP
PHP底层运行机制与工作原理详解
2020/07/31 PHP
var与Javascript变量隐式声明
2009/09/17 Javascript
JavaScript arguments 多参传值函数
2010/10/24 Javascript
js 中{},[]中括号,大括号使用详解
2011/05/12 Javascript
基于jquery实现的定时显示与隐藏div广告的实现代码
2013/08/22 Javascript
js+canvas实现动态吃豆人效果
2017/03/22 Javascript
微信小程序中顶部导航栏的实现代码
2017/03/30 Javascript
详解React-Native解决键盘遮挡问题(Keyboard遮挡问题)
2017/07/13 Javascript
Vue.js用法详解
2017/11/13 Javascript
layer.open 按钮的点击事件关闭方法
2018/08/17 Javascript
详解如何搭建mpvue框架搭配vant组件库的小程序项目
2019/05/16 Javascript
vue 项目打包时样式及背景图片路径找不到的解决方式
2019/11/12 Javascript
React 实现车牌键盘的示例代码
2019/12/20 Javascript
jQuery+ThinkPHP实现图片上传
2020/07/23 jQuery
利用Python中的输入和输出功能进行读取和写入的教程
2015/04/14 Python
Python函数式编程指南(四):生成器详解
2015/06/24 Python
Python教程之全局变量用法
2016/06/27 Python
python+numpy实现的基本矩阵操作示例
2019/07/19 Python
python编程进阶之类和对象用法实例分析
2020/02/21 Python
Python 的 __str__ 和 __repr__ 方法对比
2020/09/02 Python
意大利买卖二手奢侈品网站:LAMPOO
2020/06/03 全球购物
关于环保的标语
2014/06/13 职场文书
银行竞聘报告范文
2014/11/06 职场文书
2015年乡镇科普工作总结
2015/05/13 职场文书
2015年国庆节演讲稿范文
2015/07/30 职场文书
企业安全隐患排查治理制度
2015/08/05 职场文书
大学生创业计划书
2019/06/24 职场文书