Python进程分支fork和exec详解
来源:互联网 发布:php 数组添加键值对 编辑:程序博客网 时间:2024/05/19 12:12
在python中,任务并发一种方式是通过进程分支来实现的.在linux系统在,通过fork()方法来实现进程分支.
- fork()调用后会创建一个新的子进程,这个子进程是原父进程的副本.子进程可以独立父进程外运行.
- fork()是一个很特殊的方法,一次调用,两次返回.
- fork()它会返回2个值,一个值为0,表示在子进程返回;另外一个值为非0,表示在父进程中返回子进程ID.
以下只能在linux中运行,不能在window下运行.
进程分支fork()
实例如下:
#!/usr/bin/python#coding=utf-8import osdef 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-8import osdef child(): print('hello from child', os.getpid()) os._exit(0)child()
主代码如下:
#!/usr/bin/python#coding=utf-8import osdef 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进程分支fork和exec详解
- Linux进程fork,exec,vfork详解
- Python 多进程 fork()详解
- 进程管理:fork与exec函数及fork子进程和父进程
- 进程创建system、exec、fork
- 进程 fork exec,wait/waitpid
- fork和exec
- fork和exec
- fork和exec
- fork和exec函数
- fork和exec
- 程序员必备知识——fork和exec函数详解
- linux中fork和exec
- fork和exec()函数族
- fork()、vfork()、clone()和exec()
- fork()、vfork()、clone()和exec()
- fork和exec的区别
- fork 和 exec 对子进程继承父进程处理信号处理函数的影响
- DHCP
- 使用AudioManager控制手机音频
- SWMPr 2.0.0 now on CRAN
- 浅谈JVM体系结构
- 杭电ACM-1406-完数
- Python进程分支fork和exec详解
- 在appdelegate内设置导航控制器为根控制器
- MyBatis进阶(一)运行原理
- 升级到11.2.0.2后出现性能急剧下降(解决)
- Android退出程序并杀死该进程
- windows下安装php5.5的redis扩展
- Mysql 常用操作
- 字节流转换为字符流
- leetcode010:Regular Expression Matching