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 Web框架Flask中使用新浪SAE云存储实例
Feb 08 Python
Python使用正则匹配实现抓图代码分享
Apr 02 Python
Python脚本按照当前日期创建多级目录
Mar 01 Python
python使用thrift教程的方法示例
Mar 21 Python
如何不用安装python就能在.NET里调用Python库
Jul 12 Python
对django 模型 unique together的示例讲解
Aug 06 Python
python实现用类读取文件数据并计算矩形面积
Jan 18 Python
TFRecord格式存储数据与队列读取实例
Jan 21 Python
python中的unittest框架实例详解
Feb 05 Python
Python制作运行进度条的实现效果(代码运行不无聊)
Feb 24 Python
Python使用protobuf序列化和反序列化的实现
May 19 Python
python中__slots__节约内存的具体做法
Jul 04 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网页后退不再出现过期
2007/03/08 PHP
通过table标签,PHP输出EXCEL的实现方法
2013/07/24 PHP
thinkphp控制器调度使用示例
2014/02/24 PHP
php+highchats生成动态统计图
2014/05/21 PHP
PHP弹出对话框技巧详细解读
2015/09/26 PHP
jquery 获取dom固定元素 添加样式的简单实例
2014/02/04 Javascript
使用jQuery获得内容以及内容的属性
2015/02/26 Javascript
Bootstrap 组件之按钮(二)
2016/05/11 Javascript
关于安卓手机微信浏览器中使用XMLHttpRequest 2上传图片显示字节数为0的解决办法
2016/05/17 Javascript
Bootstrap Table服务器分页与在线编辑应用总结
2016/08/08 Javascript
JavaScript数组迭代方法
2017/03/03 Javascript
js弹出窗口简单实现代码
2017/03/22 Javascript
详解Layer弹出层样式
2017/08/21 Javascript
jQuery实现的鼠标响应缓冲动画效果示例
2018/02/13 jQuery
vue-preview动态获取图片宽高并增加旋转功能的实现
2020/07/29 Javascript
解决vue-photo-preview 异步图片放大失效的问题
2020/07/29 Javascript
python列表操作实例
2015/01/14 Python
python中format()函数的简单使用教程
2018/03/14 Python
python字符串与url编码的转换实例
2018/05/10 Python
详解python函数的闭包问题(内部函数与外部函数详述)
2019/05/17 Python
解决webdriver.Chrome()报错:Message:'chromedriver' executable needs to be in Path
2019/06/12 Python
Python目录和文件处理总结详解
2019/09/02 Python
Python figure参数及subplot子图绘制代码
2020/04/18 Python
jupyter 使用Pillow包显示图像时inline显示方式
2020/04/24 Python
利用Pycharm + Django搭建一个简单Python Web项目的步骤
2020/10/22 Python
Myprotein瑞典官方网站:畅销欧洲英国运动营养品牌
2018/01/22 全球购物
全球最大的游戏市场:G2A
2018/07/05 全球购物
法律专业个人实习自我鉴定
2013/09/23 职场文书
配件采购员岗位职责
2013/12/03 职场文书
执行力心得体会
2013/12/31 职场文书
摄影专业毕业生求职信
2014/03/13 职场文书
优秀共产党员先进事迹材料
2014/05/06 职场文书
大学生党员批评与自我批评范文
2014/10/14 职场文书
中小学生安全教育观后感
2015/06/17 职场文书
Android在Sqlite3中的应用及多线程使用数据库的建议
2022/04/24 Java/Android
nginx静态资源的服务器配置方法
2022/07/07 Servers