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使用PyGame播放Midi和Mp3文件的方法
Apr 24 Python
python使用fileinput模块实现逐行读取文件的方法
Apr 29 Python
python使用pil生成图片验证码的方法
May 08 Python
Python八大常见排序算法定义、实现及时间消耗效率分析
Apr 27 Python
使用memory_profiler监测python代码运行时内存消耗方法
Dec 03 Python
Python3字符串encode与decode的讲解
Apr 02 Python
python 3.74 运行import numpy as np 报错lib\site-packages\numpy\__init__.py
Oct 06 Python
python实现指定ip端口扫描方式
Dec 17 Python
Python多线程获取返回值代码实例
Feb 17 Python
python如何求圆的面积
Jul 01 Python
Python3爬虫中Splash的知识总结
Jul 10 Python
Python必备技巧之函数的使用详解
Apr 04 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 将逗号、空格、回车分隔的字符串转换为数组的函数
2012/06/07 PHP
取得单条网站评论以数组形式进行输出
2014/07/28 PHP
8个必备的PHP功能开发
2015/10/02 PHP
php注册系统和使用Xajax即时验证用户名是否被占用
2017/08/31 PHP
javascript[js]获取url参数的代码
2007/10/17 Javascript
自己开发Dojo的建议框架
2008/09/24 Javascript
onsubmit阻止form表单提交与onclick的相关操作
2010/09/03 Javascript
javascript高级程序设计第二版第十二章事件要点总结(常用的跨浏览器检测方法)
2012/08/22 Javascript
js/jquery获取浏览器窗口可视区域高度和宽度以及滚动条高度实现代码
2012/12/17 Javascript
两个数组去重的JS代码
2013/12/04 Javascript
javaScript的函数对象的声明详解
2015/02/06 Javascript
Jquery幻灯片特效代码分享--打开页面随机选择切换方式(3)
2015/08/15 Javascript
js实现select下拉框菜单
2015/12/08 Javascript
下一代Bootstrap的5个特点 超酷炫!
2016/06/17 Javascript
JavaScript 最佳实践:帮你提升代码质量
2016/12/03 Javascript
VUE2.0中Jsonp的使用方法
2018/05/22 Javascript
简化vuex的状态管理方案的方法
2018/06/02 Javascript
微信{"errcode":48001,"errmsg":"api unauthorized, hints: [ req_id: 1QoCla0699ns81 ]"}
2018/10/12 Javascript
Vue-Cli 3.0 中配置高德地图的两种方式
2019/06/19 Javascript
vue中的.$mount('#app')手动挂载操作
2020/09/02 Javascript
JS中队列和双端队列实现及应用详解
2020/09/29 Javascript
python写入中英文字符串到文件的方法
2015/05/06 Python
一步步教你用Python实现2048小游戏
2017/01/19 Python
python中requests和https使用简单示例
2018/01/18 Python
python使用suds调用webservice接口的方法
2019/01/03 Python
Python datetime包函数简单介绍
2019/08/28 Python
selenium+Chrome滑动验证码破解二(某某网站)
2019/12/17 Python
虚拟环境及venv和virtualenv的区别说明
2021/02/05 Python
html5中canvas图表实现柱状图的示例
2017/11/13 HTML / CSS
清除canvas画布内容(点擦除+线擦除)
2020/08/12 HTML / CSS
大码女装:Ulla Popken
2019/08/06 全球购物
政府门卫岗位职责
2014/04/29 职场文书
解除劳动合同协议书范本2014
2014/09/25 职场文书
医院保洁员岗位职责
2015/02/13 职场文书
网络销售员岗位职责
2015/04/11 职场文书
护士年终工作总结不会写?各科护士模板总结
2020/01/02 职场文书