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实现从订阅源下载图片的方法
Mar 11 Python
python访问类中docstring注释的实现方法
May 04 Python
总结Python编程中函数的使用要点
Mar 20 Python
python递归打印某个目录的内容(实例讲解)
Aug 30 Python
Python多层装饰器用法实例分析
Feb 09 Python
python实现汉诺塔算法
Mar 01 Python
Python3爬虫爬取英雄联盟高清桌面壁纸功能示例【基于Scrapy框架】
Dec 05 Python
浅谈Python大神都是这样处理XML文件的
May 31 Python
解决python 上传图片限制格式问题
Oct 30 Python
Python迭代器Iterable判断方法解析
Mar 16 Python
使用python matploblib库绘制准确率,损失率折线图
Jun 16 Python
python安装后的目录在哪里
Jun 21 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写的小东西
2006/12/06 PHP
php 正则表达式小结
2009/08/31 PHP
10个实用的PHP代码片段
2011/09/02 PHP
PHP类与对象中的private访问控制的疑问
2012/11/01 PHP
PHP JSON出错:Cannot use object of type stdClass as array解决方法
2014/08/16 PHP
基于Swoole实现PHP与websocket聊天室
2016/08/03 PHP
PHP 模拟登陆功能实例详解
2019/09/10 PHP
javascript+iframe 实现无刷新载入整页的代码
2010/03/17 Javascript
jquery自定义函数的多种方法
2014/01/09 Javascript
JqueryMobile动态生成listView并实现刷新的两种方法
2014/03/05 Javascript
JavaScript实现把数字转换成中文
2015/06/29 Javascript
浅析javascript中的Event事件
2016/12/09 Javascript
原生JS封装animate运动框架的实例
2017/10/12 Javascript
微信小程序中的canvas 文字断行和省略号显示功能的处理方法
2018/11/14 Javascript
[01:15:16]DOTA2-DPC中国联赛 正赛 Elephant vs Aster BO3 第一场 1月26日
2021/03/11 DOTA
把大数据数字口语化(python与js)两种实现
2013/02/21 Python
python实现将pvr格式转换成pvr.ccz的方法
2015/04/28 Python
在Python 3中实现类型检查器的简单方法
2015/07/03 Python
Python将阿拉伯数字转换为罗马数字的方法
2015/07/10 Python
Python通过RabbitMQ服务器实现交换机功能的实例教程
2016/06/29 Python
Django 实现外键去除自动添加的后缀‘_id’
2019/11/15 Python
TensorFlow的环境配置与安装方法
2021/02/20 Python
HTML5 背景的显示区域实现
2020/07/09 HTML / CSS
领先的荷兰线上超市:荷兰之家Holland at Home(支持中文)
2021/01/21 全球购物
怎样在程序里获得一个空指针
2015/01/24 面试题
魅力教师事迹材料
2014/01/10 职场文书
户外拓展活动方案
2014/02/11 职场文书
幼儿园元旦亲子活动方案
2014/02/17 职场文书
法律进机关实施方案
2014/03/12 职场文书
三傻大闹宝莱坞观后感
2015/06/03 职场文书
城南旧事电影观后感
2015/06/16 职场文书
幼儿园中班班级总结
2015/08/10 职场文书
财务人员入职担保书
2015/09/22 职场文书
python实现A*寻路算法
2021/06/13 Python
关于springboot 配置date字段返回时间戳的问题
2021/07/25 Java/Android
MySQL学习之基础操作总结
2022/03/19 MySQL