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垃圾回收和Linux ForkPythonLinux
- Linux fork程式的用法Linux
- fork和殭屍程式
- 程式中fork和vfork的區別
- git 同步fork的倉庫程式碼Git
- 【多程式】Linux中fork()函式詳解|多程式Linux函式
- PostgreSQL server端接收連線後fork程式SQLServer
- python使用多程式Python
- Fork倉庫
- Fork/Join框架框架
- Fork/Join 框架框架
- 使用PyInstaller打包Python程式Python
- Java Fork/Join 框架Java框架
- What's new in Dubbo-go v1.5.1Go
- 關於python的三種子程序啟動方式:fork, spawn, forkserverPythonServer
- python 中 os.fork() 與 os.waitpid(pid,*args, **args) 說明PythonAI
- python 程式的使用和理解Python
- 【Git】fork遠端倉庫,fork倉庫同步和提交pull requestGit
- git fork後如何更新Git
- fork()與vfork()函式函式
- fork failed - Cannot allocate memoryAI
- JUC之Fork/Join框架框架
- github同步fork倉庫Github
- 使用Python編寫猜拳小程式Python
- Java併發程式設計(07):Fork/Join框架機制詳解Java程式設計框架
- Github程式碼fork之後,如何與原倉庫進行同步?Github
- Seata 1.5.1 重磅釋出,支援使用者控制檯,企業版正式免費公測
- [python] Python非同步程式設計庫asyncio使用指北Python非同步程式設計
- Java併發 -- Fork/Join框架Java框架
- Git客戶端:Fork for MacGit客戶端Mac
- 理解 pcntl_fork 函式函式
- 研究linux函式 之 fork()Linux函式
- mitmdump+python的使用(程式碼篇)MITPython
- Python如何使用tkinter編寫GUI程式PythonGUI
- ☕【Java技術指南】「併發程式設計專題」Fork/Join框架基本使用和原理探究(原理及原始碼篇)Java程式設計框架原始碼
- 多執行緒高併發程式設計(8) -- Fork/Join原始碼分析執行緒程式設計原始碼