V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
wisefree
V2EX  ›  Python

python os.fork(),有关子进程入口的疑问

  •  
  •   wisefree · 2016-10-28 11:43:07 +08:00 · 2827 次点击
    这是一个创建于 2738 天前的主题,其中的信息可能已经有所发展或是发生改变。

    请大家帮忙看看,>_< python3 代码如下,运行环境 ubuntu12.04 virtualbox 虚拟机

    import os
    
    print('inlet is here of main process')
    
    pid = os.fork()
    
    if (pid ==0):
        print('child pid is running')
    else:
        print('main pid is running')
    
    

    主进程的入口时 import os 子进程得到了主进程的所有代码,有了自己的空间,为什么入口不是 import os ,而是从 os.fork()以下执行呢?

    附图如下: http://a3.topitme.com/9/cf/f7/1177624584b1af7cf9o.jpg

    15 条回复    2016-10-29 19:20:18 +08:00
    EchoUtopia
        1
    EchoUtopia  
       2016-10-28 11:48:50 +08:00
    。。设定就这样吧,如果从头那岂不是无限fork?
    raysonx
        2
    raysonx  
       2016-10-28 11:50:45 +08:00 via Android   ❤️ 2
    建议楼主看一下 Unix 的 fork 系统调用。
    简单来说:操作系统这一层就是这么设计的,操作系统才不关心你的 Python 文件,那是 Python 解释器关心的东西,不在一个层次上
    sujin190
        3
    sujin190  
       2016-10-28 11:57:08 +08:00   ❤️ 1
    你应该去看看 linux 的 fork ,既然是 fork ,自然除了所有代码数据外还包含所有状态了,锁,文件句柄,函数调用栈
    enenaaa
        4
    enenaaa  
       2016-10-28 12:58:16 +08:00 via iPad   ❤️ 1
    fork 是拷贝,包括内存数据和执行环境,只能说类 linux 设计有点奇葩。
    多进程考虑用 multiprocessing 啊,这个比较方便。
    nicegoing
        5
    nicegoing  
       2016-10-28 13:03:47 +08:00 via iPhone   ❤️ 1
    前面都有运行结果了,把主进程的结果直接拷贝给子进程。如果子进程还去跑前面的代码岂不是傻?
    BOYPT
        6
    BOYPT  
       2016-10-28 13:18:31 +08:00
    楼主你想要的是 os.system(__FILE__)吧
    wisefree
        7
    wisefree  
    OP
       2016-10-28 13:23:30 +08:00
    @raysonx 谢谢提醒!我会去看看的
    wisefree
        8
    wisefree  
    OP
       2016-10-28 13:23:47 +08:00
    @EchoUtopia 额,其实我也是这样困惑的。。
    wisefree
        9
    wisefree  
    OP
       2016-10-28 13:28:56 +08:00
    @sujin190
    @enenaaa
    确实如此,针对 linux fork , google 了一下,
    >fork 英文意思:分支, fork 系统调用复制产生的子进程与父进程(调用进程)基本一样:代码段+数据段+堆栈段+PCB ,当前的运行环境基本一样,所以子进程在 fork 之后开始向下执行,而不会从头开始执行。
    >https://www.cnblogs.com/mickole/p/3186441.html

    以后还是用 multiprocessing>_<
    wisefree
        10
    wisefree  
    OP
       2016-10-28 13:31:53 +08:00
    @BOYPT 这个是啥,没见到过,粘贴到代码里运行不了。。。
    > NameError: name '__FILE__' is not defined
    BOYPT
        11
    BOYPT  
       2016-10-28 13:33:56 +08:00
    @wisefree 记混了,__FILE__是 PHP 的, py 的应该是__file__,当前代码文件路径
    msg7086
        12
    msg7086  
       2016-10-28 23:51:22 +08:00   ❤️ 1
    克隆哪来的入口。
    启动新的应用程序才是从入口继续。
    克隆的话是一份程序变成两份一模一样的,当然两个程序都会从 fork()返回了。
    firstway
        13
    firstway  
       2016-10-29 06:52:47 +08:00 via Android   ❤️ 2
    楼上说的对, fork 完全是动态的,就在 call fork 那里分离, OS 复制成 2 个进程,分离后都从那一点各自跑各自的。他们共享执行指令,但是是不同的执行流(也就是不同的进程),这也是为什么要通过返回值 pid 来运行不同的逻辑。
    一定要分清,他们指令完全一样的(指令是死的),执行流一般是不一样,是动态的。
    在分离之初,内存其实几乎一样的,可以想象 2 个指针指向同一块内存。随着执行流的区别, OS 会对内存进行 copy on write 的操作,慢慢内存也各种写各自的。
    wisefree
        14
    wisefree  
    OP
       2016-10-29 19:20:03 +08:00
    @msg7086
    受教了,谢谢!
    wisefree
        15
    wisefree  
    OP
       2016-10-29 19:20:18 +08:00
    @firstway
    :),感谢!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   882 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 21:52 · PVG 05:52 · LAX 14:52 · JFK 17:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.