请大家帮忙看看,>_< 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()以下执行呢?
1
EchoUtopia 2016-10-28 11:48:50 +08:00
。。设定就这样吧,如果从头那岂不是无限fork?
|
2
raysonx 2016-10-28 11:50:45 +08:00 via Android 2
建议楼主看一下 Unix 的 fork 系统调用。
简单来说:操作系统这一层就是这么设计的,操作系统才不关心你的 Python 文件,那是 Python 解释器关心的东西,不在一个层次上 |
3
sujin190 2016-10-28 11:57:08 +08:00 1
你应该去看看 linux 的 fork ,既然是 fork ,自然除了所有代码数据外还包含所有状态了,锁,文件句柄,函数调用栈
|
4
enenaaa 2016-10-28 12:58:16 +08:00 via iPad 1
fork 是拷贝,包括内存数据和执行环境,只能说类 linux 设计有点奇葩。
多进程考虑用 multiprocessing 啊,这个比较方便。 |
5
nicegoing 2016-10-28 13:03:47 +08:00 via iPhone 1
前面都有运行结果了,把主进程的结果直接拷贝给子进程。如果子进程还去跑前面的代码岂不是傻?
|
6
BOYPT 2016-10-28 13:18:31 +08:00
楼主你想要的是 os.system(__FILE__)吧
|
8
wisefree OP @EchoUtopia 额,其实我也是这样困惑的。。
|
9
wisefree OP @sujin190
@enenaaa 确实如此,针对 linux fork , google 了一下, >fork 英文意思:分支, fork 系统调用复制产生的子进程与父进程(调用进程)基本一样:代码段+数据段+堆栈段+PCB ,当前的运行环境基本一样,所以子进程在 fork 之后开始向下执行,而不会从头开始执行。 >https://www.cnblogs.com/mickole/p/3186441.html 以后还是用 multiprocessing>_< |
10
wisefree OP @BOYPT 这个是啥,没见到过,粘贴到代码里运行不了。。。
> NameError: name '__FILE__' is not defined |
12
msg7086 2016-10-28 23:51:22 +08:00 1
克隆哪来的入口。
启动新的应用程序才是从入口继续。 克隆的话是一份程序变成两份一模一样的,当然两个程序都会从 fork()返回了。 |
13
firstway 2016-10-29 06:52:47 +08:00 via Android 2
楼上说的对, fork 完全是动态的,就在 call fork 那里分离, OS 复制成 2 个进程,分离后都从那一点各自跑各自的。他们共享执行指令,但是是不同的执行流(也就是不同的进程),这也是为什么要通过返回值 pid 来运行不同的逻辑。
一定要分清,他们指令完全一样的(指令是死的),执行流一般是不一样,是动态的。 在分离之初,内存其实几乎一样的,可以想象 2 个指针指向同一块内存。随着执行流的区别, OS 会对内存进行 copy on write 的操作,慢慢内存也各种写各自的。 |