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获取脚本所在目录的正确方法
Apr 15 Python
采用python实现简单QQ单用户机器人的方法
Jul 03 Python
Python中endswith()函数的基本使用
Apr 07 Python
在Python中操作字符串之startswith()方法的使用
May 20 Python
Django框架下在视图中使用模版的方法
Jul 16 Python
再谈Python中的字符串与字符编码(推荐)
Dec 14 Python
python中Matplotlib实现绘制3D图的示例代码
Sep 04 Python
python嵌套字典比较值与取值的实现示例
Nov 03 Python
小米5s微信跳一跳小程序python源码
Jan 08 Python
深入浅析python 中的匿名函数
May 21 Python
Python使用统计函数绘制简单图形实例代码
May 15 Python
Python查找算法的实现 (线性、二分,分块、插值查找算法)
Apr 24 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 清空varnish 缓存的详解(包括指定站点下的)
2013/06/20 PHP
分享五个PHP7性能优化提升技巧
2015/12/07 PHP
PHP文件上传问题汇总(文件大小检测、大文件上传处理)
2015/12/24 PHP
PHP生成各种随机验证码的方法总结【附demo源码】
2017/06/05 PHP
在laravel中实现ORM模型使用第二个数据库设置
2019/10/24 PHP
js实现的网页颜色代码表全集
2007/07/17 Javascript
js函数般调用正则
2008/04/08 Javascript
提取字符串中年月日的函数代码
2013/11/05 Javascript
node.js中的favicon.ico请求问题处理
2014/12/15 Javascript
JS动态创建DOM元素的方法
2015/06/09 Javascript
深入剖析JavaScript:Object类型
2016/05/10 Javascript
JS实现的Unicode编码转换操作示例
2017/04/28 Javascript
angular2中router路由跳转navigate的使用与刷新页面问题详解
2017/05/07 Javascript
Node学习记录之cluster模块
2017/05/31 Javascript
js简易版购物车功能
2017/06/17 Javascript
jquery实现用户登陆界面(示例讲解)
2017/09/06 jQuery
Vue官方文档梳理之全局配置
2017/11/22 Javascript
jQuery实现轮播图效果
2019/11/26 jQuery
node.js中 mysql 增删改查操作及async,await处理实例分析
2020/02/11 Javascript
前端vue如何使用高德地图
2020/11/05 Javascript
如何在VUE中使用vue-awesome-swiper
2021/01/04 Vue.js
Pycharm更换python解释器的方法
2018/10/29 Python
python3通过selenium爬虫获取到dj商品的实例代码
2019/04/25 Python
Python实现将蓝底照片转化为白底照片功能完整实例
2019/12/13 Python
Python生成并下载文件后端代码实例
2020/08/31 Python
解决CSS3 transition-delay 属性默认值0不带单位失效的问题
2020/10/29 HTML / CSS
美国知名的旅游网站:OneTravel
2018/10/09 全球购物
国际商务专业学生个人的自我评价
2013/09/28 职场文书
市场营销专业自荐书
2014/06/10 职场文书
求职信的正确写法
2014/07/10 职场文书
浪漫婚礼主题活动策划方案
2014/09/15 职场文书
先进事迹材料怎么写
2014/12/30 职场文书
单位考核鉴定意见
2015/06/05 职场文书
共青团优秀团员申请书(范文)
2019/08/15 职场文书
一篇文章了解正则表达式的替换技巧
2022/02/24 Javascript
Android开发EditText禁止输入监听及InputFilter字符过滤
2022/06/10 Java/Android