Python进程分支fork和exec详解

在python中,任务并发一种方式是通过进程分支来实现的.在linux系统在,通过fork()方法来实现进程分支.

  • fork()调用后会创建一个新的子进程,这个子进程是原父进程的副本.子进程可以独立父进程外运行.
  • fork()是一个很特殊的方法,一次调用,两次返回.
  • 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”和”v”的组合模式下,基本的”v”执行形式,需要传入可执行的程序名,以及用来运行程序的命令行参数字符的列表或元组.最后还要传入运行新程序的需要的环境变量env字典参数.运行新程序的搜索路径为当前文件的搜索路径.

  • os.execlpe(program, cmdarg1, cmdarg2, …, cmdargN, env)

    在”p”和”v”的组合模式下,基本的”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)
时间: 2024-10-12 22:05:27

Python进程分支fork和exec详解的相关文章

python处理word文件:win32com用法详解

目标:用python处理doc文件 方法:引入win32com模块 ************************************************************************** 一.安装 ************************************************************************** 首先要先下载安装win32com模块(起先在linux下装不成功,后在windows下面成功了...) 下载地址:http

快速部署Python应用:Nginx+uWSGI配置详解

快速部署Python应用:Nginx+uWSGI配置详解 相比于PHP,Python应用的部署很麻烦,比较常用的方法有fcgi与wsgi,然而这两种都很让人头痛.文章介绍了Nginx+uwsgi的简便方法,来快速的部署Python应用. AD: 在PHP里,最方便的就是deployment了,只要把php文件丢到支持PHP的路径里面,然后访问那个路径就能使用了:无论给主机添加多少PHP应用,只要把目录改好就没你的事了,完全不用关心php-cgi运行得如何,deployment极为方便. 反观Py

进程管理之工作管理详解(job control)

进程管理之工作管理详解(job control) 1 什么是工作管理(job control) 我们知道linux是多任务多终端工作的操作系统.我们可以在多个终端进行工作,也可以在一个终端进行多个任务工作.那在一个终端同时进行多个工作任务,就称为工作管理.比如这种情况,在一个终端,你想要复制文件,同时你还想压缩打包文件,甚至你还想编辑文件,这个时候就要用到工作管理.工作管理的情况,大概是这样的.直接上图. 首先,你要明白前台,后台的概念.前台就是当前我们登陆shell操作的终端,我们与之交互,看

xargs和exec详解、screen命令、curl命令

1.xargs和exec详解xargs execfind /var/log/  -type f  -mtime +10   (超过10天的文件)find /var/log/  -type f  -mtime +10  -exec cp {} {}.bak \; (将找到的文件都复制成.bak文件)find /var/log/  -type f  -mtime +10  |xargs  -i cp {}  {}.1  (复制重命名)ls |xargsls x* ls x*  |xargs rmls

**Python中的深拷贝和浅拷贝详解

Python中的深拷贝和浅拷贝详解 这篇文章主要介绍了Python中的深拷贝和浅拷贝详解,本文讲解了变量-对象-引用.可变对象-不可变对象.拷贝等内容. 要说清楚Python中的深浅拷贝,需要搞清楚下面一系列概念: 变量-引用-对象(可变对象,不可变对象)-切片-拷贝(浅拷贝,深拷贝) [变量-对象-引用] 在Python中一切都是对象,比如说:3, 3.14, 'Hello', [1,2,3,4],{'a':1}...... 甚至连type其本身都是对象,type对象 Python中变量与C/

Python:file/file-like对象方法详解【单个文件读写】

IO中读写文件操作方法汇总!----The_Third_Wave的学习笔记! 本文由@The_Third_Wave(Blog地址:http://blog.csdn.net/zhanh1218)原创.不定期更新,有错误请指正. Sina微博关注:@The_Third_Wave 如果这篇博文对您有帮助,为了好的网络环境,不建议转载,建议收藏!如果您一定要转载,请带上后缀和本文地址. class file(object) |  file(name[, mode[, buffering]]) -> fi

(转)python time模块和datetime模块详解

python time模块和datetime模块详解 原文:http://www.cnblogs.com/tkqasn/p/6001134.html 一.time模块 time模块中时间表现的格式主要有三种: a.timestamp时间戳,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量 b.struct_time时间元组,共有九个元素组. c.format time 格式化时间,已格式化的结构使时间更具可读性.包括自定义格式和固定格式. 1.时间格式转换图: 2.主要ti

Python学习一:序列基础详解

作者:NiceCui 本文谢绝转载,如需转载需征得作者本人同意,谢谢. 本文链接:http://www.cnblogs.com/NiceCui/p/7858473.html 邮箱:[email protected] 日期:2017-11-18 Python学习一:序列基础详解 一:序列介绍 Python中一些类型的变量,就像容器一样,收纳多个数据,序列就像一个有序的队伍,像整齐的万里长城,存储着各种各样的数据,他们按照一定的秩序排列在一起,很威武,很美观,所以说序列是有序的数据集合.序列包含的一

Python网络请求urllib和urllib3详解

Python网络请求urllib和urllib3详解 urllib是Python中请求url连接的官方标准库,在Python2中主要为urllib和urllib2,在Python3中整合成了urllib. 而urllib3则是增加了连接池等功能,两者互相都有补充的部分. urllib urllib作为Python的标准库,基本上涵盖了基础的网络请求功能. urllib.request urllib中,request这个模块主要负责构造和发起网络请求,并在其中加入Headers.Proxy等. 发