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实现115网盘自动下载的方法
Sep 30 Python
Python实现检测服务器是否可以ping通的2种方法
Jan 01 Python
详解如何将python3.6软件的py文件打包成exe程序
Oct 09 Python
使用Pandas将inf, nan转化成特定的值
Dec 19 Python
Python之Class&Object用法详解
Dec 25 Python
Python生成词云的实现代码
Jan 14 Python
python 生成器需注意的小问题
Sep 29 Python
Python 多进程、多线程效率对比
Nov 19 Python
详解Django自定义图片和文件上传路径(upload_to)的2种方式
Dec 01 Python
python 实现逻辑回归
Dec 30 Python
python 数据类型强制转换的总结
Jan 25 Python
Python requests库参数提交的注意事项总结
Mar 29 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全排列递归算法代码
2012/10/09 PHP
php实现通过ftp上传文件
2015/06/19 PHP
详谈PHP编码转换问题
2015/07/28 PHP
php实现商城购物车的思路和源码分析
2020/07/23 PHP
统一接口:为FireFox添加IE的方法和属性的js代码
2007/03/25 Javascript
extjs 学习笔记 四 带分页的grid
2009/10/20 Javascript
Javascript insertAfter() 实现函数代码
2011/10/12 Javascript
jqgrid 编辑添加功能详细解析
2013/11/08 Javascript
深入解读JavaScript中的Hoisting机制
2015/08/12 Javascript
JS实现的手机端精简幻灯片效果
2016/09/05 Javascript
jQuery Validate设置onkeyup验证的实例代码
2016/12/09 Javascript
jQuery Form插件使用详解_动力节点Java学院整理
2017/07/17 jQuery
一个Js文件函数中调用另一个Js文件函数的方法演示
2017/08/14 Javascript
解决layer弹出层的内容页点击按钮跳转到新的页面问题
2019/09/14 Javascript
Angular单元测试之事件触发的实现
2020/01/20 Javascript
如何实现js拖拽效果及原理解析
2020/05/08 Javascript
原生JS实现汇率转换功能代码实例
2020/05/13 Javascript
vue全局使用axios的操作
2020/09/08 Javascript
python发送arp欺骗攻击代码分析
2014/01/16 Python
python使用__slots__让你的代码更加节省内存
2018/09/05 Python
Python闭包和装饰器用法实例详解
2019/05/22 Python
Pandas删除数据的几种情况(小结)
2019/06/21 Python
Flask框架学习笔记之路由和反向路由详解【图文与实例】
2019/08/12 Python
Python列表如何更新值
2020/05/27 Python
世界排名第一的运动鞋市场:Flight Club
2020/01/03 全球购物
琳达·法罗眼镜英国官网:Linda Farrow英国
2021/01/19 全球购物
Servlet的实例是在生命周期什么时候创建的?配置servlet最重要的是什么?
2012/05/30 面试题
营业经理岗位职责
2013/11/10 职场文书
数控技术应届生求职信
2013/11/13 职场文书
学生打架检讨书大全
2014/01/23 职场文书
考试没考好检讨书
2014/01/31 职场文书
人力资源经理的岗位职责范本
2014/02/28 职场文书
学生社团文化节开幕式主持词
2014/03/28 职场文书
孔庙导游词
2015/02/04 职场文书
与死神共舞观后感
2015/06/15 职场文书
HTML5 语义化标签(移动端必备)
2021/08/23 HTML / CSS