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 getopt 参数处理小示例
Jun 09 Python
Python标准库内置函数complex介绍
Nov 25 Python
Python装饰器使用实例:验证参数合法性
Jun 24 Python
Python的爬虫程序编写框架Scrapy入门学习教程
Jul 02 Python
漂亮的Django Markdown富文本app插件的实现
Jan 02 Python
Python实现的IP端口扫描工具类示例
Feb 15 Python
python如何保证输入键入数字的方法
Aug 23 Python
python3实现用turtle模块画一棵随机樱花树
Nov 21 Python
python离线安装外部依赖包的实现
Feb 13 Python
python-xpath获取html文档的部分内容
Mar 06 Python
PyCharm永久激活方式(推荐)
Sep 22 Python
Python实现迪杰斯特拉算法并生成最短路径的示例代码
Dec 01 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
phpmyadmin导入(import)文件限制的解决办法
2009/12/11 PHP
PHP基于php_imagick_st-Q8.dll实现JPG合成GIF图片的方法
2014/07/11 PHP
详谈PHP文件目录基础操作
2014/11/11 PHP
MacOS 安装 PHP的图片裁剪扩展Tclip
2015/03/25 PHP
ThinkPHP文件缓存类代码分享
2015/04/22 PHP
Yii2.0表关联查询实例分析
2016/07/18 PHP
浅谈PHP各环境下的伪静态配置
2019/03/13 PHP
PHP实现微信提现(企业付款到零钱)
2019/08/01 PHP
关于Curl在Swoole协程中的解决方案详析
2019/09/12 PHP
js 全兼容可高亮二级缓冲折叠菜单
2010/06/04 Javascript
Date对象格式化函数代码
2010/07/17 Javascript
原生javascript实现图片轮播效果代码
2010/09/03 Javascript
Javascript的getYear、getFullYear、getUTCFullYear异同分享
2011/11/30 Javascript
javascript页面渲染速度测试脚本分享
2014/04/15 Javascript
JavaScript中Number.MIN_VALUE属性的使用示例
2015/06/04 Javascript
页面内容排序插件jSort使用方法
2015/10/10 Javascript
浅析JavaScript访问对象属性和方法及区别
2015/11/16 Javascript
详解JavaScript函数
2015/12/01 Javascript
ionic实现滑动的三种方式
2016/08/27 Javascript
JS简单实现点击跳转登陆邮箱功能的方法
2017/10/31 Javascript
微信小程序 JS动态修改样式的实现方法
2018/12/16 Javascript
layui固定下拉框的显示条数(有滚动条)的方法
2019/09/10 Javascript
转换科学计数法的数值字符串为decimal类型的方法
2018/07/16 Python
Python读取系统文件夹内所有文件并统计数量的方法
2018/10/23 Python
利用python numpy+matplotlib绘制股票k线图的方法
2019/06/26 Python
Python可视化工具如何实现动态图表
2020/10/23 Python
芬兰灯具网上商店:Nettilamppu.fi
2018/06/30 全球购物
俄罗斯最大的灯具网站:Fandeco
2020/03/14 全球购物
土木工程专业推荐信
2014/02/19 职场文书
综治维稳工作汇报
2014/10/27 职场文书
上课睡觉万能检讨书
2015/02/17 职场文书
通知书大全
2015/04/27 职场文书
简短清晨问候语
2015/11/10 职场文书
禁毒心得体会范文
2016/01/15 职场文书
优秀家长事迹材料(2016推荐版)
2016/02/29 职场文书
linux下安装redis图文详细步骤
2021/12/04 Redis