1.5.1 Python程式使用 -- fork

weixin_34148340發表於2018-06-15

1.程式的建立-fork

Python的os模組封裝了常見的系統呼叫,其中就包括fork,可以在Python程式中輕鬆建立子程式:

import os

# 注意,fork函式,只在Unix/Linux/Mac上執行,windows不可以
pid = os.fork()

if pid == 0:
    print('哈哈1')
else:
    print('哈哈2')

執行結果:


5809200-f032c4bacd0618c6.gif
3.gif

說明:
程式執行到os.fork()時,作業系統會建立一個新的程式(子程式),然後複製父程式的所有資訊到子程式中
然後父程式和子程式都會從fork()函式中得到一個返回值,在子程式中這個值一定是0,而父程式中是子程式的 id號
在Unix/Linux作業系統中,提供了一個fork()系統函式,它非常特殊。

普通的函式呼叫,呼叫一次,返回一次,但是fork()呼叫一次,返回兩次,因為作業系統自動把當前程式(稱為父程式)複製了一份(稱為子程式),然後,分別在父程式和子程式內返回。

子程式永遠返回0,而父程式返回子程式的ID。

這樣做的理由是,一個父程式可以fork出很多子程式,所以,父程式要記下每個子程式的ID,而子程式只需要呼叫getppid()就可以拿到父程式的ID。

2. getpid()、getppid()

import os

rpid = os.fork()
if rpid<0:
    print("fork呼叫失敗。")
elif rpid == 0:
    print("我是子程式(%s),我的父程式是(%s)"%(os.getpid(),os.getppid()))
    x+=1
else:
    print("我是父程式(%s),我的子程式是(%s)"%(os.getpid(),rpid))

print("父子程式都可以執行這裡的程式碼")

執行結果:

我是父程式(19360),我的子程式是(19361)
父子程式都可以執行這裡的程式碼
我是子程式(19361),我的父程式是(19360)
父子程式都可以執行這裡的程式碼

3.多程式修改全域性變數

#coding=utf-8
import os
import time

num = 0

# 注意,fork函式,只在Unix/Linux/Mac上執行,windows不可以
pid = os.fork()

if pid == 0:
    num+=1
    print('哈哈1---num=%d'%num)
else:
    time.sleep(1)
    num+=1
    print('哈哈2---num=%d'%num)

執行結果:
哈哈1---num=1
哈哈2---num=1

總結:多程式中,每個程式中所有資料(包括全域性變數)都各有擁有一份,互不影響

4. 多次fork問題

如果在一個程式,有2次的fork函式呼叫,是否就會有3個程式呢?


#coding=utf-8
import os
import time

# 注意,fork函式,只在Unix/Linux/Mac上執行,windows不可以
pid = os.fork()
if pid == 0:
    print('哈哈1')
else:
    print('哈哈2')

pid = os.fork()
if pid == 0:
    print('哈哈3')
else:
    print('哈哈4')

time.sleep(1)

執行結果:
哈哈2
哈哈4
哈哈3
哈哈1
哈哈4
哈哈3

說明:

5809200-eea442ce4e29714d.png
image.png

父子程式的執行順序: 父程式、子程式執行順序沒有規律,完全取決於作業系統的排程演算法

相關文章