python進程

進程                                                                                                                     linux

進程是計算機中的程序關於某數據集合上的一次運行活動,是系統進行資源費配和調度的基本單位,是操做系統結構的基礎。在當代面向線程設計的計算機結構中,進程是線程的容器,同一個進程中的多個線程能夠共享其資源,而進程與進城之間能夠起到數據隔離的做用(即同一個程序執行兩次,就會在操做系統出現兩個進程,因此同時運行同一個軟件作不一樣的事情也不會混亂)。併發

進程的並行和併發                                                                                                                       app

並行:是指二者同時進行,微觀上,就是在一個時刻,有不一樣的程序執行,要求必須有多個處理器。異步

併發:是指系統資源有限,二者只能交替輪流使用資源,目的是爲了提升效率,從宏觀上看某個時刻是同時進行的。socket

同步、異步、阻塞、非阻塞                                                                                                     ide

 同步和異步:       spa

  同步就是一個任務的完成須要依賴另外一個任務時,只有等待被依賴的任務完成後,依賴的任務纔算完成,這是一種可靠的任務序列。成功都成功,失敗都失敗,兩個任務的 狀態保持一致。操作系統

        異步(回調機制)是不須要等待被依賴的任務完成,只是通知被依賴的任務要完成什麼操做,依賴的任務也當即執行,本身完成了整個任務就算完成了。至於被依賴的任務是否完成,依賴他的任務沒法肯定,因此這是一種不可靠的任務序列。線程

阻塞和非阻塞:設計

  阻塞:就是等待。

  非阻塞:不等待。  

  好比建立socket對某個地址進行connect、獲取接收數據recv時默認都會等待(鏈接成功或接收到數據),才執行後續操做。
  若是設置setblocking(False),以上兩個過程就再也不等待,可是會報BlockingIOError的錯誤,只要捕獲便可。

  使用process模塊建立進程            

 在Windows操做系統中因爲沒有fork(linux操做系統中建立進程的機制),在建立子進程的時候會自動 import 啓動它的這個文件, 而在 import 的時候又執行了整個文件。
所以若是將process()直接寫在文件中就會無限遞歸建立子進程報錯。 因此必須把建立子進程的部分使用if __name__ ==‘__main__’ 判斷保護起來,import 的時候 ,就不會遞歸運行了。 
import time
from multiprocessing import Process

def f(n):    
    print(n)
    print('子進程')

if __name__ == '__main__':
    p = Process(target=f, args=(666,))
    p.start()
    time.sleep(1)
    print('主進程')
建立子進程
import time
from multiprocessing import Process

def f(name):
    print('hello', name)
    time.sleep(1)
    print('子進程')
if __name__ == '__main__':
    p = Process(target=f, args=('bob',))
    p.start()
    p.join()
    print('父進程')
join

繼承建立進程:

def task(n):
    n+=1
    print(n)
if __name__ == '__main__':
    for i in range(3):
        p=Process(target=task,args=(i,))
        p.start()
View Code

進程之間的數據隔離:

class MyProcess(Process):
    def __init__(self,name):
        super().__init__()
        self.name=name
    def run(self):
        print(os.getpid())
        print(self.name)
if __name__ == '__main__':

    p1=MyProcess('messi')
    p2=MyProcess('c羅')
    p3=MyProcess('salah')

    p1.start() #start會自動調用run
    p2.start()
    p3.start()

    p1.join()
    print(os.getppid())
View Code

進程之間的數據共享:

  Queue:

import multiprocessing

def task(arg,q):
    q.put(arg)
if __name__ == '__main__':
    q = multiprocessing.Queue()
    for i in range(5):
        p=multiprocessing.Process(target=task,args=(i,q))
        p.start()
    while True:
        v=q.get()
        print(v)
示例

  Manager:

import multiprocessing
import time

def task(arg,dic):
    time.sleep(2)
    dic[arg]=100
if __name__ == '__main__':
    m=multiprocessing.Manager()
    dic=m.dict()
    process_list=[]
    for i in range(5):
        p=multiprocessing.Process(target=task,args=(i,dic))
        p.start()
        process_list.append(p)
    while 1:
        count=0
        for p in process_list:
            if not p.is_alive():
                count+=1
        if count == len(process_list):
            break
    print(dic)
示例

進程池:

import time
from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor

def task(arg):
    time.sleep(2)
    print(arg)

if __name__ == '__main__':
    pool = ProcessPoolExecutor(5)
    for i in range(10):
        pool.submit(task,i)
進程池
相關文章
相關標籤/搜索