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 爬虫抓站的一些技巧总结
Jan 10 Python
numpy向空的二维数组中添加元素的方法
Nov 01 Python
python 不同方式读取文件速度不同的实例
Nov 09 Python
python绘图模块matplotlib示例详解
Jul 26 Python
python实现图片压缩代码实例
Aug 12 Python
flask/django 动态查询表结构相同表名不同数据的Model实现方法
Aug 29 Python
使用PyCharm进行远程开发和调试的实现
Nov 04 Python
Python连接mysql方法及常用参数
Sep 01 Python
python基本算法之实现归并排序(Merge sort)
Sep 01 Python
python switch 实现多分支选择功能
Dec 21 Python
详解用 python-docx 创建浮动图片
Jan 24 Python
python单例模式的应用场景实例讲解
Feb 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
第二节--PHP5 的对象模型
2006/11/16 PHP
解析php常用image图像函数集
2013/06/24 PHP
PHP文件上传类实例详解
2016/04/08 PHP
Yii视图操作之自定义分页实现方法
2016/07/14 PHP
Laravel接收前端ajax传来的数据的实例代码
2017/07/20 PHP
php基于自定义函数记录log日志方法
2017/07/21 PHP
JavaScript.Encode手动解码技巧
2010/07/14 Javascript
js的压缩及jquery压缩探讨(提高页面加载性能/保护劳动成果)
2013/01/29 Javascript
jquery实现页面图片等比例放大缩小功能
2014/02/12 Javascript
JavaScript实现16进制颜色值转RGB的方法
2015/02/09 Javascript
jQuery插件imgPreviewQs实现上传图片预览
2016/01/15 Javascript
js下载文件并修改文件名
2017/05/08 Javascript
Vue 2中ref属性的使用方法及注意事项
2017/06/12 Javascript
Vue使用vue-cli创建项目
2017/09/01 Javascript
详解Vue2.0组件的继承与扩展
2018/11/23 Javascript
浅谈layui数据表格判断问题(加入表单元素),设置单元格样式
2019/10/26 Javascript
js实现一款简单踩白块小游戏(曾经很火)
2019/12/02 Javascript
Nuxt的路由动画效果案例
2020/11/06 Javascript
python使用ctypes模块调用windowsapi获取系统版本示例
2014/04/17 Python
Python学习小技巧之列表项的排序
2017/05/20 Python
使用Python获取并处理IP的类型及格式方法
2018/11/01 Python
python接口自动化(十六)--参数关联接口后传(详解)
2019/04/16 Python
Django中信号signals的简单使用方法
2019/07/04 Python
pytorch sampler对数据进行采样的实现
2019/12/31 Python
TensorFlow 多元函数的极值实例
2020/02/10 Python
python如何通过闭包实现计算器的功能
2020/02/22 Python
使用python从三个角度解决josephus问题的方法
2020/03/27 Python
numpy的Fancy Indexing和array比较详解
2020/06/11 Python
如何使用scrapy中的ItemLoader提取数据
2020/09/30 Python
VSCode 自定义html5模板的实现
2019/12/05 HTML / CSS
Under Armour安德玛中国官网:美国高端运动科技品牌
2018/03/09 全球购物
创先争优活动党员公开承诺书
2014/08/29 职场文书
2015年干部教育培训工作总结
2015/05/15 职场文书
2015年控辍保学工作总结
2015/05/18 职场文书
2016春季幼儿园小班开学寄语
2015/12/03 职场文书
MySQL 慢查询日志深入理解
2021/04/22 MySQL