zoukankan      html  css  js  c++  java
  • python fork 挨踢骚客的旅途 博客频道 CSDN.NET

    python fork - 挨踢骚客的旅途 - 博客频道 - CSDN.NET

    python fork

    分类: python 2911人阅读 评论(0) 收藏 举报

    fork 是 python linux下 os 模块下的一个方法,用来创建一个子进程。今天遇到这个问题,所以找文章来稍微了解一下。以下来自http://www.myelin.co.nz/post/2003/3/13/#200303135。不当之处多指教。

    1、有时,程序在一个进程中运行可能会遇到一些问题。如进程可能会占用过多的内存或者打开太多的文件,或者根本无法运行。

    2、一般来说,需要将进程分为两个,在子进程中执行一些代码,然后向父进程总返回结果。

         这个过程是通过管道来实现的。os.pipe()创建一个管道。一个管道包括两个端,一个读(父进程)一个写(子进程)。子进程将结果写入写端,然后关闭之。父进程从读端读出。

        以os.fork()创建新进程,复制所有文件描述符。则父子进程都有了管道的读端和写端的拷贝。直到管道一端的所有拷贝都被关闭,那么管道才关闭,因而在创建子进程之后需要调用os.close()关闭父进程的写端。

       所以,运行过程是:

               ---创建管道

               ---创建子进程。

       子进程:

               ----需要关闭管道读端

               ----开始执行

               ----向写端写入结果

               ----进程死亡

      父进程:

               ----关闭管道写端

               ----从读端读取数据直到子进程死亡或者关闭

               ----调用waitpid方法确保子进程已经被撤销(在FreeBSD中不这么做,那么子进程永远不会被死亡)

               ----进程输出

    3、代码

    #!/usr/bin/env python

    import os, sys

    print "I'm going to fork now - the child will write something to a pipe, and the parent will read it back"

    r, w = os.pipe()           # r,w是文件描述符, 不是文件对象

    pid = os.fork()
    if pid:
        # 父进程
        os.close(w)           # 关闭一个文件描述符
        r = os.fdopen(r)      # 将r转化为文件对象
        print "parent: reading"
        txt = r.read()
        os.waitpid(pid, 0)   # 确保子进程被撤销
    else:
        # 子进程             
        os.close(r)
        w = os.fdopen(w, 'w')
        print "child: writing"
        w.write("here's some text from the child")
        w.close()
        print "child: closing"
        sys.exit(0)

    print "parent: got it; text =", txt

  • 相关阅读:
    python简介
    计算机基础
    C# 验证数字
    在字符串指定的索引下添加字符,输出换行
    js中实现子页面向父页面中赋值
    js搜索相同类型的控件全选、取值(Checkbox)
    Nhibernate中多Or条件的查询,很多Or的查询
    js遍历checkbox获取数据
    Jquery获取web窗体关闭事件,排除刷新页面
    两年多的工作感悟
  • 原文地址:https://www.cnblogs.com/lexus/p/2864939.html
Copyright © 2011-2022 走看看