1. 程式人生 > >python並發編程知識點總結

python並發編程知識點總結

成功 上下文 ... 堆棧 ioerror eve 事件 import 限制

1.到底什麽是線程?什麽是進程?

Python自己沒有這玩意,Python中調用的操作系統的線程和進程.

2.Python多線程情況下:

  • 計算密集型操作:效率低,Python內置的一個全局解釋器鎖,鎖的作用就是保證同一時刻一個進程中只有一個線程可以被cpu調度,多線程無法利用多核優勢,可以通過多進程方式解決,但是比較浪費資源.
  • IO操作:效率高

3.Python多進程的情況下:

  • 計算密集型操作:效率高(浪費資源),不得已而為之.
  • IO操作:效率高(浪費資源)

4.為什麽有這把GIL鎖?

Python語言的創始人在開發這門語言時,目的快速把語言開發出來,如果加上GIL鎖(C語言加鎖),切換時按照100條字節指令來進行線程間的切換.

5.Python中線程和進程(GIL鎖)

GIL鎖,全局解釋器鎖.用於限制一個進程中同一時刻只有一個線程被cpu調度.
擴展:默認GIL鎖在執行100個cpu指令(過期時間).
查看GIL切換的指令個數

import sys
v1 = sys.getcheckinterval()
print(v1)

6.為什麽要創建線程?

由於線程是cpu工作的最小單元,創建線程可以利用多核優勢實現並行操作(Java/C#).
註意:線程是為了工作.

7.為什麽要創建進程?

進程和進程之間做數據隔離(Java/C#).
註意:進程是為了提供環境讓線程工作.

8.進程和線程的區別?

進程是資源分配的最小單位,線程是程序執行的最小單位.

進程有自己的獨立地址空間,每啟動一個進程,系統就會為它分配地址空間,建立數據表來維護代碼段,堆棧段和數據段,這種操作非常昂貴.而線程是共享進程中的數據的,使用相同的地址空間,因此CPU切換一個線程的花費遠比進程小很多,同時創建一個線程的開銷比進程要小很多.
線程之間的通信更方便,同一進程下的線程共享全局變量,靜態變量,而進程之間的通信需要以通信的方式(IPC)進行。不過如何處理好同步與互斥是編寫多線程程序的難點。
但是多進程程序更健壯,多線程程序只要有一個線程死掉,整個進程也死掉了,而一個進程死掉並不會對另外一個進程造成影響,因為進程有自己獨立的地址空間。
也正是由於GIL鎖的原因:IO密集型操作可以使用多線程,計算密集型可以使用多進程.

9.線程創建的越多越好嗎?

不好.線程之間進行切換時,要做上下文管理.

10.生產者消費者模型解決了什麽問題?

不用一直等待的問題.

11.Lock和RLock的區別是RLock可以多次加鎖.

12.進程和線程以及協程的區別?

進程是cpu資源分配的最小單元,一個進程中可以有多個線程。
線程是cpu計算的最小單元。
對於Python來說他的進程和線程和其他語言有差異,是有GIL鎖.
GIL鎖保證一個進程中同一時刻只有一個線程被cpu調度.
註意:IO密集型操作可以使用多線程,計算密集型可以使用多進程.

協程,是由程序員創造出來的一個不是真實存在的東西.
協程,是微線程,對一個線程進程分片,使得線程在代碼塊之間進行來回切換執行,而不是在原來逐行執行.

13.IO多路復用作用?

檢測多個socket是否已經發生變化(是否已經連接成功/是否已經獲取數據)(可讀/可寫)
IO多路復用作用?
檢測多個socket是否發生變化。
操作系統檢測socket是否發生變化,有三種模式:
select:最多1024個socket;循環去檢測。
poll:不限制監聽socket個數;循環去檢測(水平觸發)。
epoll:不限制監聽socket個數;回調方式(邊緣觸發)。
Python模塊:
select.select
select.epoll

14.socket默認是否是阻塞的?阻塞體現在哪裏?

默認是阻塞,填在等待消息和連接

15.什麽是異步非阻塞?

  • 非阻塞,不等待。
    比如創建socket對某個地址進行connect、獲取接收數據recv時默認都會等待(連接成功或接收到數據),才執行後續操作。
    如果設置setblocking(False),以上兩個過程就不再等待,但是會報BlockingIOError的錯誤,只要捕獲即可。
  • 異步,通知,執行完成之後自動執行回調函數或自動執行某些操作(通知)。
    比如做爬蟲中向某個地址baidu.com發送請求,當請求執行完成之後自執行回調函數。

16.什麽是同步阻塞?

- 阻塞:等 
- 同步:按照順序逐步執行

17.什麽是協程?

協程也可以稱為“微線程”,就是開發者控制線程執行流程,控制先執行某段代碼然後再切換到另外函執行代碼...來回切換。

18.協程可以提高並發嗎?

協程自己本身無法實現並發(甚至性能會降低)。
協程+IO切換性能提高。

19.提高並發方案:

  • 多進程
  • 多線程
  • 單線程提供並發:
    • 基於IO多路復用+socket非阻塞,實現並發請求(一個線程100個請求)
      https://www.cnblogs.com/apollo1616/p/10351506.html

    • 協程+IO切換:gevent
      https://www.cnblogs.com/apollo1616/p/10351577.html

    • 基於事件循環的異步(執行完某個人物後自動調用我給他的函數),非阻塞
      https://www.cnblogs.com/apollo1616/p/10351573.html

    • 基於事件循環的異步非阻塞框架(Twisted),scrapy框架(單線程完成並發)

python並發編程知識點總結