1.5.1 Python程式使用 -- fork
1.程式的建立-fork
Python的os模組封裝了常見的系統呼叫,其中就包括fork,可以在Python程式中輕鬆建立子程式:
import os
# 注意,fork函式,只在Unix/Linux/Mac上執行,windows不可以
pid = os.fork()
if pid == 0:
print('哈哈1')
else:
print('哈哈2')
執行結果:
說明:
程式執行到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
說明:
父子程式的執行順序: 父程式、子程式執行順序沒有規律,完全取決於作業系統的排程演算法
相關文章
- 1.5.1 Python函式初識Python函式
- 子程式等待父程式退出及fork使用
- python中fork()函式生成子程式分析Python函式
- fork、父程式和子程式
- fork和殭屍程式
- Linux fork程式的用法Linux
- Python垃圾回收和Linux ForkPythonLinux
- 使用Java 7.0的 Fork/Join框架進行併發程式設計Java框架程式設計
- git 同步fork的倉庫程式碼Git
- 程式中fork和vfork的區別
- listener為何要fork兩次子程式
- linux fork程式空間問題Linux
- PostgreSQL server端接收連線後fork程式SQLServer
- Linux中fork的使用注意事項Linux
- 【多程式】Linux中fork()函式詳解|多程式Linux函式
- linux fork 程式後 主程式的全域性變數Linux變數
- Linux下程式相關:fork(),wait(),exec()LinuxAI
- fork同時建立多個子程式的方法
- Linux fork 炸彈解析,Linux Fork BombLinux
- Fork/Join 框架框架
- Fork倉庫
- fork waitAI
- Fork/Join框架框架
- What's new in Dubbo-go v1.5.1Go
- Linux系統程式設計(8)—— 程式之程式控制函式forkLinux程式設計函式
- python使用多程式Python
- Java Fork/Join 框架Java框架
- 誰都無法 fork Android,因為它就沒法 forkAndroid
- linux系統程式設計之程式(三):程式複製fork,孤兒程式,殭屍程式Linux程式設計
- 【Git】fork遠端倉庫,fork倉庫同步和提交pull requestGit
- Seata 1.5.1 重磅釋出,支援使用者控制檯,企業版正式免費公測
- 關於python的三種子程序啟動方式:fork, spawn, forkserverPythonServer
- fork failed - Cannot allocate memoryAI
- fork()與vfork()函式函式
- JUC之Fork/Join框架框架
- github同步fork倉庫Github
- git fork後如何更新Git
- fork與vfork函式函式