python網編 程序之開啟乙個程序

2022-02-26 09:43:09 字數 2394 閱讀 2690

直接上**:
import

time,os

from multiprocessing import

process # 匯入模組

deffunc():

time.sleep(1)

print('

hello

',os.getpid()) #

os.getpid()的作用是列印程序id

if__name__ == '

__main__':

process(target=func).start() #

開啟了乙個新的程序,然後在這個新的程序裡執行了func中的**

time.sleep(1)

print('

hello2

',os.getpid()) #

列印程序id

執行結果:

hello2 18448

hello 1972

這就開啟了乙個程序,可以通過程序id來進行測試,兩個程序id不一樣說明是同時有兩個程序在工作,實現了非同步的效果。

這裡有幾個概念:

父程序:父程序執行的過程中建立了子程序。例如pycharm作為乙個程序,在pycharm裡啟動的程序就是子程序,此時pycharm就是父程序

子程序:與父程序是相對的

主程序:一般我們直接執行的那個程式就是主程序。

這裡有幾個問題:

為什麼一定要加if__name__ == __main__:這句

如果mac和linux系統沒有這句話仍然不會報錯,這個是因為不同的作業系統啟動程序的方式不同

windows開啟乙個子程序的方式:由於程序間資料隔離,所以理論上講子程序無法應用父程序的資料,也無法執行父程序中的任何**是import父程序所在的檔案,所以通過import父程序所在的檔案的方式載入一遍父程序的所有資料,所以如果不加這句話的話,開啟的子程序中也會執行process(target=func).star()

那麼就會一直開子程序直到系統受不了。這很違揹我們的本意,所以通過主程序中加入if __main__ == __name__:來控制主程序只開啟乙個子程序;

linux和mac系統是通過copy父程序的記憶體解決這個問題,也就是說會把process(target=func).start()之前的記憶體copy到子程序中。這個時候要執行func(),因為記憶體中已經有了func()所以直接執行就ok了

總結:有與作業系統不同,導致開啟子程序的方式有__main__的區別,莫慌,見到這樣的錯誤,加上if __main__ == __name__:即可。

②如何開啟多個子程序?(不信可通過os.getpid()證明一下,我信了所以不寫)

if

__main__ == __name__

:

for i in range(10):

process(target=func).start()

開子程序也可以這樣寫:
if

__main__ == __name__

:

for i in range(10):

p = process(target=func) # 通過process類例項化乙個物件p

p.start() # 開啟程序

③如何給子程序傳參?

我們說各程序之間資料隔離,那麼如何傳參呢?

def

func(name):

print('

hello

',name)

if__name__ == __main__

: p = process(target=func,args=('

carrie

')) #

通過args傳入乙個元組,target對應的函式有幾個引數就放到這個元組裡

p.start() #

start是非阻塞的 如果開啟多個子程序的話 並非是挨個的開啟 而是對作業系統說:請幫我開啟n個子程序,

#然後就去幹自己該幹的事情了。所以作業系統什麼時候開,先開誰後開誰都不管。

④子程序可以有返回值麼?

理論上來講子程序不應該有返回值,因為記憶體隔離的問題,子程序中的函式的返回值無法傳給父程序

霸特,ipc機制,通過程序間通訊機制可以把返回值返回給主程序

Python網編 程序之互斥鎖 lock

我們千方百計實現了程式的非同步,讓多個任務可以同時在幾個程序中併發處理,他們之間的執行沒有順序,一旦開啟也不受我們控制。儘管併發程式設計讓我們能更加充分的利用io資源,但是也給我們帶來了新的問題。當多個程序使用同乙份資料資源的時候,就會引發資料安全或順序混亂問題。import osimport ti...

Python網編 程序之間的資料隔離

寫在前面 控制台的本質是乙個檔案 檔案操作的時候盡量不要用r w a 如果用要小心檔案指標混亂 隨著程序數量的增多會有一些隱患from multiprocessing import process n 100 定義乙個全域性變數 deffunc global n 通過global改變n的值 n 1 ...

python網編 通過物件導向開啟子程序

直接上 import osfrom multiprocessing import process class myprocess process 這裡建立乙個類 繼承process def run self 必須寫乙個run方法 print os.getpid if name main p mypr...