進程 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('父進程')
繼承建立進程:
def task(n): n+=1 print(n) if __name__ == '__main__': for i in range(3): p=Process(target=task,args=(i,)) p.start()
進程之間的數據隔離:
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())
進程之間的數據共享:
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)