python-- 啟動進程的兩種方式


進程

進程:

是指正在執行的程序。是程序執行過程中的一次 指令,數據集等的集合。也可以叫做程序的一次執行過程。進程是一個動態的概念。

進程由三大部分組成:代碼段,數據段,PCB:進程管理控制

因為有GIL鎖的存在,在Cpython中,沒有真正的線程並行。但是有真正的多進程並行當你的任務是計算密集的情況下,使用多進程好

總結:在CPython中,IO密集用多線程,計算密集用多進程

進程的三大基本狀態:

  • 就緒狀態:已經獲得運行需要的所有資源,除了CPU
  • 執行狀態:已經獲得了所有資源包括cpu,處於正在運行
  • 阻塞狀態:因為各種原因,進程放棄了cpu,導致進程無法繼續執行,此時進程處於內存中,繼續等待獲取cpu

進程的一個特殊狀態:

  • 掛起狀態:是指因為種原因,進程放棄了cpu,導致進程無法繼續執行,此時進程被踢出內存。

並行 : 兩個進程在同一時間點發生

並發 : 兩個進程在同一時間間隔內運行

同步 : 某一個任務的執行必須依賴於另一個任務的返回結果

異步 : 某一個任務的執行,不需要依賴於另一個任務的返回,只需要告訴另一個任務一聲

阻塞 : 程序因為類似於IO等待、等待事件等導致無法繼續執行。

非阻塞:程序遇到類似於IO操作時,不再阻塞等待,如果沒有及時的處理IO,就報錯或者跳過等其他操作

啟動進程的兩種方式

程序並不能單獨運行,只有將程序裝載到內存中,系統為它分配資源才能運行,而這種執行的程序就稱之為進程。程序和進程的區別就在於:程序是指令的集合,它是進程運行的靜態描述文本;進程是程序的一次執行活動,屬於動態概念。

  • 進程只能在一個時間干一件事,如果想同時干兩件事或多件事,進程就無能為力了。
  • 進程在執行的過程中如果阻塞,例如等待輸入input,整個進程就會掛起,即使進程中有些工作不依賴於輸入的數據,也將無法執行。

第一種方式

import os
import time
from multiprocessing import Process


def func(n):
    time.sleep(5)
    print('這里是子進程,子進程的pid是%s,父進程的pid是%s' % (os.getpid(), os.getppid()))


if __name__ == '__main__':
    p = Process(target=func, args=(1,))  # 實例化一個進程對象
    p.start()  # 開啟一個子進程
    print('這里是父進程,父進程的pid是%s,父父的pid是%s' % (os.getpid(), os.getppid()))

結果

這里是父進程,父進程的pid是3620,父父的pid是2762
這里是子進程,子進程的pid是3621,父進程的pid是3620

os.getpid()獲取的是當前進程自己的pid

os.getppid()獲取的是當前進程的父進程的pid

第二種方式,繼承的方式
from multiprocessing import Process


class MyProcess(Process):
    def __init__(self):
        super(MyProcess, self).__init__()

    def run(self):
        print('這是以繼承類的方式開啟的子進程')


if __name__ == '__main__':
    p1 = MyProcess()
    p1.start()  # 是指,解釋器告訴操作系統,去幫我開啟一個進程,就緒狀態,方法必須為run
    # p1.run()# 告訴操作系統,現在馬上幫我執行這個子進程 執行

結果:

這是以繼承類的方式開啟的子進程
import multiprocessing, time


def run(n):
    time.sleep(2)
    print('%s in the run...' % n)


if __name__ == '__main__':
    for i in range(5):
        m = multiprocessing.Process(target=run,args=(i,))
        m.start()

結果

0 in the run...
1 in the run...
2 in the run...
3 in the run...
4 in the run...

2秒后一起執行的

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM