在python中,任务并发一种方式是通过进程分支来实现的.在linux系统在,通过fork()方法来实现进程分支.
- fork()调用后会创建一个新的子进程,这个子进程是原父进程的副本.子进程可以独立父进程外运行.
- fork()是一个很特殊的方法,一次调用,两次返回.
- fork()它会返回2个值,一个值为0,表示在子进程返回;另外一个值为非0,表示在父进程中返回子进程ID.
以下只能在linux中运行,不能在window下运行.
进程分支fork()
实例如下:
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!'
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代码如下:
import os
def child():
print('hello from child', os.getpid())
os._exit(0)
child()
主代码如下:
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)
<script type="text/javascript">
$(function () {
$('pre.prettyprint code').each(function () {
var lines = $(this).text().split('\n').length;
var $numbering = $('<ul/>').addClass('pre-numbering').hide();
$(this).addClass('has-numbering').parent().append($numbering);
for (i = 1; i <= lines; i++) {
$numbering.append($('<li/>').text(i));
};
$numbering.fadeIn(1700);
});
});
</script>
版权声明:本文为博主原创文章,未经博主允许不得转载。
分享到:
相关推荐
掌握`fork()`和`exec`系列函数是理解和编写多进程Python程序的关键。在处理需要同时进行的异步任务,如后台服务、数据处理等场景时,这些工具非常有用。理解它们的工作原理和使用方法,能帮助开发者有效地利用系统...
在python中,任务并发一种方式是通过进程分支来实现的.在linux系统在,通过fork()方法来实现进程分支. 1.fork()调用后会创建一个新的子进程,这个子进程是原父进程的副本.子进程可以独立父进程外运行. 2.fork()是一个很...
这里的内容以Linux进程基础和Linux文本流为基础。subprocess包主要功能是执行外部的命令和程序。...在Python中,我们通过标准库中的subprocess包来fork一个子进程,并运行一个外部的程序(fork,exec见Linux进程基础)。
- `os.fork()`:创建子进程,父进程和子进程各自拥有独立的内存空间。 - `os.exec*()`系列函数:在子进程中替换当前进程映像执行新的程序。 5. **路径操作**: - `os.path.join(path1[, path2[, ...]])`:组合多...
像Linux进程那样,一个进程可以fork一个子进程,并让这个子进程exec另外一个程序。在Python中,我们通过标准库中的subprocess包来fork一个子进程,并运行一个外部的程序。 subprocess包中定义有数个创建子进程的...
本文实例讲述了Python subprocess模块功能...运行python的时候,我们都是在创建并运行一个进程,linux中一个进程可以fork一个子进程,并让这个子进程exec另外一个程序。在python中,我们通过标准库中的subprocess包来f
### Python标准库详解 #### 一、核心模块 Python的核心模块是构成Python语言基础的重要组成部分,这些模块在Python启动时自动加载,无需显式导入。它们涵盖了从基本的数据操作到高级编程工具的各种功能。 ##### ...
### Python模块详解:os、sys、time、socket等 #### os模块 `os`模块是Python的一个标准库,提供了诸多与操作系统交互的功能。通过`os`模块,开发者能够执行文件和目录的操作,如创建文件夹、删除文件、获取当前...
系统调用是应用程序与内核交互的主要方式,如open()用于打开文件,write()用于写入数据,fork()和exec()用于进程创建。掌握这些基本的系统调用对于编写高效且可靠的程序至关重要。 此外,嵌入式开发还需要关注硬件...
通过学习`<sys/types.h>`和`<sys/wait.h>`头文件中的函数,如fork、exec、waitpid等,可以创建、终止和管理进程。 4. **内存管理**:C语言提供了malloc和free函数来动态分配和释放内存,这对于处理任务信息的存储和...
对于系统调用的理解,如fork、exec、wait、pipe、socket等,也是考核的重点。 **三、计算机网络** 网络协议(TCP/IP五层模型或七层模型)、HTTP/HTTPS协议、网络传输、负载均衡、网络安全、DNS解析等知识是必备的。...
- **典型系统调用示例**:如fork()、exec()、open()、close()等。 - **安全性和性能考虑**:分析系统调用的安全隐患及其对性能的影响。 **设备驱动程序开发** - **驱动模型**:包括字符设备、块设备和网络设备的...