网站首页  汉语字词  英语词汇  考试资料  写作素材  旧版资料

请输入您要查询的考试资料:

 

标题 python中的进程分支fork和exec详解
内容
    在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)
随便看

 

在线学习网考试资料包含高考、自考、专升本考试、人事考试、公务员考试、大学生村官考试、特岗教师招聘考试、事业单位招聘考试、企业人才招聘、银行招聘、教师招聘、农村信用社招聘、各类资格证书考试等各类考试资料。

 

Copyright © 2002-2024 cuapp.net All Rights Reserved
更新时间:2025/5/15 16:03:19