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 相关文章推荐
paramiko模块安装和使用(远程登录服务器)
Jan 27 Python
Python微信企业号开发之回调模式接收微信端客户端发送消息及被动返回消息示例
Aug 21 Python
Django添加sitemap的方法示例
Aug 06 Python
Python中一个for循环循环多个变量的示例
Jul 16 Python
Django ORM多对多查询方法(自定义第三张表&ManyToManyField)
Aug 09 Python
在Python中获取操作系统的进程信息
Aug 27 Python
Tensorflow设置显存自适应,显存比例的操作
Feb 03 Python
Python日志syslog使用原理详解
Feb 18 Python
python数据库操作mysql:pymysql、sqlalchemy常见用法详解
Mar 30 Python
Iconfont(矢量图标)+iconmoon(图标svg互转)配合javascript实现社交分享系统
Apr 21 Python
python对一个数向上取整的实例方法
Jun 18 Python
Python 实现将某一列设置为str类型
Jul 14 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
桌面中心(四)数据显示
2006/10/09 PHP
你可能不知道PHP get_meta_tags()函数
2014/05/12 PHP
smarty高级特性之过滤器的使用方法
2015/12/25 PHP
getElementById在任意一款浏览器中都可以用吗的疑问回复
2007/05/13 Javascript
使用ExtJS技术实现的拖动树结点
2010/08/05 Javascript
Javascript基础教程之函数对象和属性
2015/01/18 Javascript
jQuery插件StickUp实现网页导航置顶
2015/04/12 Javascript
JavaScript学习小结(7)之JS RegExp
2015/11/29 Javascript
让图片跳跃起来  javascript图片轮播特效
2016/02/16 Javascript
JavaScript+Java实现HTML页面转为PDF文件保存的方法
2016/05/30 Javascript
在localStorage中存储对象数组并读取的方法
2016/09/24 Javascript
微信小程序 扎金花简单实例
2017/02/21 Javascript
JS常见算法详解
2017/02/28 Javascript
Vue异步组件使用详解
2017/04/08 Javascript
JavaScript实现移动端轮播效果
2017/06/06 Javascript
JavaScript代码实现txt文件的上传预览功能
2018/03/27 Javascript
微信小程序实现漂亮的弹窗效果
2020/05/26 Javascript
vuejs 动态添加input框的实例讲解
2018/08/24 Javascript
Vue实现根据hash高亮选项卡
2019/05/27 Javascript
使用JQuery自动完成插件Auto Complete详解
2019/06/18 jQuery
JavaScript基于面向对象实现的无缝滚动轮播示例
2020/01/17 Javascript
python3使用requests模块爬取页面内容的实战演练
2017/09/25 Python
恢复百度云盘本地误删的文件脚本(简单方法)
2017/10/21 Python
python opencv设置摄像头分辨率以及各个参数的方法
2018/04/02 Python
Python编写一个优美的下载器
2018/04/15 Python
python模块smtplib实现纯文本邮件发送功能
2018/05/22 Python
Python SELENIUM上传文件或图片实现过程
2019/10/28 Python
Python3 使用selenium插件爬取苏宁商家联系电话
2019/12/23 Python
PyCharm 2020 激活到 2100 年的教程
2020/03/25 Python
python3.4中清屏的处理方法
2020/07/06 Python
快速实现一个简单的canvas迷宫游戏的示例
2018/07/04 HTML / CSS
一套C#面试题
2013/10/09 面试题
春节联欢会主持词
2014/03/24 职场文书
学习焦裕禄同志为人民服务思想汇报
2014/09/10 职场文书
大学生第一学年自我鉴定2015
2014/09/28 职场文书
情侣之间的道歉短信
2015/05/12 职场文书