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 相关文章推荐
在Django的视图(View)外使用Session的方法
Jul 23 Python
Linux 发邮件磁盘空间监控(python)
Apr 23 Python
Python模拟随机游走图形效果示例
Feb 06 Python
numpy matrix和array的乘和加实例
Jun 28 Python
python利用百度AI实现文字识别功能
Nov 27 Python
Python列表常见操作详解(获取,增加,删除,修改,排序等)
Feb 18 Python
将python文件打包成EXE应用程序的方法
May 22 Python
Django实现发送邮件功能
Jul 18 Python
图解python全局变量与局部变量相关知识
Nov 02 Python
numpy:找到指定元素的索引示例
Nov 26 Python
pycharm安装及如何导入numpy
Apr 03 Python
浅谈tensorflow中dataset.shuffle和dataset.batch dataset.repeat注意点
Jun 08 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中for循环语句的几种变型
2007/03/16 PHP
php通过会话控制实现身份验证实例
2016/10/18 PHP
php面向对象程序设计入门教程
2019/06/22 PHP
PHP基于openssl实现非对称加密代码实例
2020/06/19 PHP
javascript 表单规则集合对象
2009/07/21 Javascript
javascript 内存回收机制理解
2011/01/17 Javascript
浏览器图片选择预览、旋转、批量上传的JS代码实现
2013/12/04 Javascript
JQuery基础语法小结
2015/02/27 Javascript
js实现同一页面多个运动效果的方法
2015/04/10 Javascript
jquery移动点击的项目到列表最顶端的方法
2015/06/24 Javascript
JQuery实现Ajax加载图片的方法
2015/12/24 Javascript
解决vue中使用swiper插件问题及swiper在vue中的用法
2018/04/04 Javascript
微信小程序视图控件与bindtap之间的问题的解决
2019/04/08 Javascript
Vue监听页面刷新和关闭功能
2019/06/20 Javascript
layui给下拉框、按钮状态、时间赋初始值的方法
2019/09/10 Javascript
解决vuex数据异步造成初始化的时候没值报错问题
2019/11/13 Javascript
Laravel 如何在blade文件中使用Vue组件的示例代码
2020/06/28 Javascript
Javascript 模拟mvc实现点餐程序案例详解
2020/12/24 Javascript
Python使用os模块和fileinput模块来操作文件目录
2016/01/19 Python
Python爬取APP下载链接的实现方法
2016/09/30 Python
Python 使用PIL numpy 实现拼接图片的示例
2018/05/08 Python
Python中的Django基本命令实例详解
2018/07/15 Python
Django Rest framework认证组件详细用法
2019/07/25 Python
初次部署django+gunicorn+nginx的方法步骤
2019/09/11 Python
python内置函数sorted()用法深入分析
2019/10/08 Python
Python数据库封装实现代码示例解析
2020/09/05 Python
HTML5样式控制示例代码
2013/11/27 HTML / CSS
写给保洁员表扬信
2014/01/08 职场文书
软件研发工程师岗位职责
2014/09/30 职场文书
医院办公室主任岗位职责
2015/04/01 职场文书
网吧温馨提示
2015/07/17 职场文书
K8s部署发布Golang应用程序的实现方法
2021/07/16 Golang
golang内置函数len的小技巧
2021/07/25 Golang
配置Kubernetes外网访问集群
2022/03/31 Servers
Windows Server 2016服务器用户管理及远程授权图文教程
2022/08/14 Servers
mysql通过group by分组取最大时间对应数据的两种有效方法
2022/09/23 MySQL