在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)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
更新日志
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]