先說一下什么是進程,線程
進程:進程時計算機程序一次執行的實例,由 程序段 數據段 PCB組成,是計算機資源分配和調度的基本單位,也是線程的容器
線程:線程也叫作輕量級進程,是程序執行的最小單位,他本身只擁有少部分執行必須的資源。
進程和線程的VS(創建,通信,穩定性):
(1)線程共享內存空間;進程的內存是獨立的
(2)同一個進程的線程之間可以直接交流;兩個進程想通信,必須通過一個中間代理來實現
(3)創建新線程很簡單; 創建新進程需要對其父進程進行一次克隆
(4)一個線程可以控制和操作同一進程里的其他線程;但是進程只能操作子進程
(5)改變主線程(如優先權),可能會影響其它線程;多進程的穩定性好,改變父進程,不影響子進程
多進程和多線程:
因為GIL的問題導致系統中同一時間點只能有一個線程被解釋器解釋,這就導致了線程無法實現並行,無法充分的利用我們計算機的多核資源,python所謂的多線程編程就類似於單核CPU情況下的多進程編程。
相比之下多進程下每個進程執行的時候都會創建一個解釋器,所以就能夠比較好的計算機的多和資源實現並行。
那么,我們改如何解決GIL鎖的問題呢?
1.更換cpython為jpython(不建議)
2.使用多進程完成多線程的任務
3.在使用多線程可以使用c語言去實現
問題1: 什么時候會釋放Gil鎖,
1 遇到像 i/o操作這種 會有時間空閑情況 造成cpu閑置的情況會釋放Gil
2 會有一個專門ticks進行計數 一旦ticks數值達到100 這個時候釋放Gil鎖 線程之間開始競爭Gil鎖(說明:
ticks這個數值可以進行設置來延長或者縮減獲得Gil鎖的線程使用cpu的時間)
問題2: 互斥鎖和Gil鎖的關系
Gil鎖 : 保證同一時刻只有一個線程能使用到cpu
互斥鎖 : 多線程時,保證修改共享數據時有序的修改,不會產生數據修改混亂
https://www.cnblogs.com/shunge/p/8120047.html
https://blog.csdn.net/IAlexanderI/article/details/70168318
http://python.jobbole.com/85231/
協程
協程又叫微線程,簡單點說協程是進程和線程的升級版,進程和線程都面臨着內核態和用戶態的切換問題而耗費許多切換時間,而協程就是用戶自己控制切換的時機,不再需要陷入系統的內核態.
Python里最常見的yield就是協程的思想!
補充
進程間通信方式
1.管道
1.它是半雙工的(即數據只能在一個方向上流動),具有固定的讀端和寫端。
2.它只能用於具有親緣關系的進程之間的通信(也是父子進程或者兄弟進程之間)。
3.它可以看成是一種特殊的文件,對於它的讀寫也可以使用普通的read、write 等函數。但是它不是普通的文件,並不屬於其他任何文件系統,並且只存在於內存中。
2.消息隊列
消息隊列,是消息的鏈接表,存放在內核中。一個消息隊列由一個標識符(即隊列ID)來標識。
-
-
消息隊列是面向記錄的,其中的消息具有特定的格式以及特定的優先級。
-
消息隊列獨立於發送與接收進程。進程終止時,消息隊列及其內容並不會被刪除。
-
消息隊列可以實現消息的隨機查詢,消息不一定要以先進先出的次序讀取,也可以按消息的類型讀取
-
3.信號量
信號量(semaphore)與已經介紹過的 IPC 結構不同,它是一個計數器。信號量用於實現進程間的互斥與同步,而不是用於存儲進程間通信數據。
-
-
信號量用於進程間同步,若要在進程間傳遞數據需要結合共享內存。
-
信號量基於操作系統的 PV 操作,程序對信號量的操作都是原子操作。
-
每次對信號量的 PV 操作不僅限於對信號量值加 1 或減 1,而且可以加減任意正整數。
-
支持信號量組。
-
4. 共享內存
共享內存(Shared Memory),指兩個或多個進程共享一個給定的存儲區。
-
-
共享內存是最快的一種 IPC,因為進程是直接對內存進行存取。
-
因為多個進程可以同時操作,所以需要進行同步。
-
信號量+共享內存通常結合在一起使用,信號量用來同步對共享內存的訪問。
-
