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写的Socks5协议代理服务器
Aug 06 Python
django开发之settings.py中变量的全局引用详解
Mar 29 Python
启动targetcli时遇到错误解决办法
Oct 26 Python
浅谈使用Python变量时要避免的3个错误
Oct 30 Python
Python中判断子串存在的性能比较及分析总结
Jun 23 Python
Win10系统下安装labelme及json文件批量转化方法
Jul 30 Python
python中open函数的基本用法示例
Sep 07 Python
YUV转为jpg图像的实现
Dec 09 Python
python 实现批量替换文本中的某部分内容
Dec 13 Python
python实现堆排序的实例讲解
Feb 21 Python
Python pathlib模块使用方法及实例解析
Oct 05 Python
opencv检测动态物体的实现
Jul 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实现微信小程序人脸识别刷脸登录功能
2018/05/24 PHP
PHP中“=>
2019/03/01 PHP
JavaScript 对象模型 执行模型
2009/12/06 Javascript
javascript 随机展示头像实现代码
2011/12/06 Javascript
JQuery筛选器全系列介绍
2013/08/27 Javascript
Javascript闭包实例详解
2015/11/29 Javascript
详谈JS中实现种子随机数及作用
2016/07/19 Javascript
Web打印解决方案之普通报表打印功能
2016/08/29 Javascript
Vue.js开发环境搭建
2016/11/10 Javascript
js实现导航栏中英文切换效果
2017/01/16 Javascript
JavaScript函数节流和函数去抖知识点学习
2018/07/31 Javascript
详解webpack2异步加载套路
2018/09/14 Javascript
vue主动刷新页面及列表数据删除后的刷新实例
2018/09/16 Javascript
Angularjs实现数组随机排序的方法
2018/10/02 Javascript
优雅的elementUI table单元格可编辑实现方法详解
2018/12/23 Javascript
Express结合Webpack的全栈自动刷新
2019/05/23 Javascript
js实现贪吃蛇小游戏(加墙)
2020/07/31 Javascript
[01:00]DOTA2 store: Collection of Artisan's Wonders
2015/08/12 DOTA
Mac 上切换Python多版本
2017/06/17 Python
Python语言描述最大连续子序列和
2017/12/05 Python
Python排序搜索基本算法之希尔排序实例分析
2017/12/09 Python
答题辅助python代码实现
2018/01/16 Python
Python3实现的Mysql数据库操作封装类
2018/06/06 Python
Django使用paginator插件实现翻页功能的实例
2018/10/24 Python
python实现鸢尾花三种聚类算法(K-means,AGNES,DBScan)
2019/06/27 Python
django 中QuerySet特性功能详解
2019/07/25 Python
PYTHON发送邮件YAGMAIL的简单实现解析
2019/10/28 Python
Python调用Windows API函数编写录音机和音乐播放器功能
2020/01/05 Python
完美解决TensorFlow和Keras大数据量内存溢出的问题
2020/07/03 Python
浅谈优化Django ORM中的性能问题
2020/07/09 Python
CSS3中的opacity属性使用教程
2015/08/19 HTML / CSS
技术人员面试提纲
2013/11/28 职场文书
卫生厅领导班子党的群众路线教育实践活动整改措施
2014/09/20 职场文书
交通安全主题班会
2015/08/12 职场文书
市直属机关2016年主题党日活动总结
2016/04/05 职场文书
为什么你写的height:100%不起作用
2021/05/10 HTML / CSS