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海龟绘图实例教程
Jul 24 Python
使用相同的Apache实例来运行Django和Media文件
Jul 22 Python
TensorFlow实现RNN循环神经网络
Feb 28 Python
如何利用Python模拟GitHub登录详解
Jul 15 Python
应用OpenCV和Python进行SIFT算法的实现详解
Aug 21 Python
keras实现多种分类网络的方式
Jun 11 Python
pyqt5 textEdit、lineEdit操作的示例代码
Aug 12 Python
Python3如何在服务器打印资产信息
Aug 27 Python
pycharm使用技巧之自动调整代码格式总结
Nov 04 Python
解决selenium+Headless Chrome实现不弹出浏览器自动化登录的问题
Jan 09 Python
selenium3.0+python之环境搭建的方法步骤
Feb 01 Python
8g内存用python读取10文件_面试题-python 如何读取一个大于 10G 的txt文件?
May 28 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 str_pad() 将字符串填充成指定长度的字符串
2010/02/23 PHP
深入PHP中的HashTable结构详解
2013/06/13 PHP
php仿微信红包分配算法的实现方法
2016/05/13 PHP
php写入文件不覆盖的实例讲解
2019/09/17 PHP
javascript对数组的常用操作代码 数组方法总汇
2011/01/27 Javascript
javascript学习笔记(八)正则表达式
2014/10/08 Javascript
js中 javascript:void(0) 用法详解
2015/08/11 Javascript
jquery实现的简单二级菜单效果代码
2015/09/22 Javascript
使用jQuery和ajax代替iframe的方法(详解)
2017/04/12 jQuery
vue.js中v-on:textInput无法执行事件问题的解决过程
2017/07/12 Javascript
javascript实现数字配对游戏的实例讲解
2017/12/14 Javascript
浅谈React高阶组件
2018/03/28 Javascript
教你如何用node连接redis的示例代码
2018/07/12 Javascript
JS常见构造模式实例对比分析
2018/08/27 Javascript
基于Nodejs的Tcp封包和解包的理解
2018/09/19 NodeJs
vue键盘事件点击事件加native操作
2020/07/27 Javascript
[46:55]完美世界DOTA2联赛决赛 FTD vs Phoenix 第三场 11.08
2020/11/11 DOTA
python 实现上传图片并预览的3种方法(推荐)
2017/07/14 Python
Django实现简单分页功能的方法详解
2017/12/05 Python
浅谈Python中的私有变量
2018/02/28 Python
tensorflow mnist 数据加载实现并画图效果
2020/02/05 Python
Python爬取12306车次信息代码详解
2020/08/12 Python
python如何提升爬虫效率
2020/09/27 Python
Matplotlib中rcParams使用方法
2021/01/05 Python
css3实现平移效果(transfrom:translate)的示例
2020/11/13 HTML / CSS
应届毕业生的个人自我鉴定
2013/10/24 职场文书
学院书画协会部门岗位职责
2013/12/01 职场文书
委托证明的格式
2014/01/10 职场文书
中学生自我鉴定
2014/02/04 职场文书
文秘应聘自荐书范文
2014/02/18 职场文书
生产部厂长助理职位说明书
2014/03/03 职场文书
机工车间主任岗位职责
2014/03/05 职场文书
大学本科生职业生涯规划书范文
2014/09/14 职场文书
落实八项规定专题民主生活会对照检查材料
2014/09/15 职场文书
导游词之南京汤山温泉
2019/11/26 职场文书
Nginx如何配置根据路径转发详解
2022/07/23 Servers