import os實驗的執行結果為:(請注意,每次執行的pid和印出來的順序會不同)
def myFoo(num : int) -> int:
loop_times = 0
print('start pid', os.getpid())
f = os.fork()
if f == 0:
# child process: num*(3^5)
while loop_times < 5:
num *= 3
print('child', os.getpid(), loop_times, num)
loop_times += 1
else:
# parent process: num*(2^10)
while loop_times < 10:
num *= 2
print('parent', os.getpid(), loop_times, num)
loop_times += 1
return num
def main():
print('pid', os.getpid(), myFoo(2))
print('pid', os.getpid(), 'finish')
if __name__ == '__main__':
main()
start pid 5653在f = os.fork()這一行,parent process #5653呼叫os.fork(),呼叫後傳回child process的pid #5654給parent process的變數f,而child process誕生於呼叫os.fork()後,在child process中也會傳回值給變數f,但是因為child process並沒有從呼叫os.fork()開始,所以傳回的值是0。至此之後,所有的expression都一分為二,parent process和child process都各自有一份並進行動作。
parent 5653 0 4
parent 5653 1 8
parent 5653 2 16
parent 5653 3 32
parent 5653 4 64
child 5654 0 6
parent 5653 5 128
parent 5653 6 256
child 5654 1 18
parent 5653 7 512
child 5654 2 54
parent 5653 8 1024
child 5654 3 162
parent 5653 9 2048
child 5654 4 486
pid 5653 486
pid 5653 2048
pid 5654 finish
pid 5653 finish
上述例子中,還有一處值得探討的是print('pid', os.getpid(), myFoo(2))這一行輸出的結果
pid 5653 486和pid 5653 2048,執行輸出動作都是parent process,但是輸出內容有parent process從myFoo()回傳的2048和child process從myFoo()回傳的486。原因是,parent process呼叫print(),當print()進行到一半時跳到myFoo()之中,在myFoo()中呼叫os.fork()從此一分為二,parent process執行完myFoo()後回傳給呼叫myFoo的process,也就是parent process,child process執行完myFoo()後回傳給呼叫myFoo的process,一樣也是parent process,所以才會輸出pid 5653 486和pid 5653 2048;print('pid', os.getpid(), 'finish')這一行是在一分為二後才會進行的,parent process和child process個別進行,才會輸出pid 5654 finish和pid 5653 finish這兩行。
沒有留言:
張貼留言