Python3.5 學習十

多進程:編程

多線程和多進程的區別:服務器

Python多線程不適合CPU操做密集型的任務,適合IO操做密集型的任務(IO操做不佔用CPU)網絡

Python折中解決多線程不能真正同步運算的方案是:起多個進程,每一個進程中的線程均可以同時在多核中運行,缺點是不能共享內存數據。多線程

 

協程:微線程,用戶本身控制,CPU不切換。舉例:yield就是協程的一種實現併發

  遇到IO操做就切換異步

 

Gevent是一個第三方庫,能夠輕鬆經過gevent實現高效同步或異步編程。在Gevent中用到的主要模式是Greenlet。它是以C擴展模塊形式接入Python的輕量級協程。Greenlet所有運行在主程序操做系統的進程內部。但他們被協做式的調度。socket

 

論事件驅動與異步IO:異步編程

一般,咱們寫服務器處理模型的程序時,有如下幾種模型:性能

1 每收到一個請求,都啓動一個進程操作系統

2 每收到一個請求,都啓動一個線程

3 每收到一個請求,放入一個事件列表,讓主進程經過非阻塞I/O方式來處理請求(協程)

上面幾種方式:各有千秋:

1,因爲建立新的進程的開銷比較大,因此會致使服務器性能比較差,但實現比較簡單。

2,因爲要設計到線程的同步,有可能會面臨死鎖等問題。

3,在寫應用程序代碼是,邏輯比前兩種都複雜。

綜合考慮各方面因素,通常普通使用第三種方式進行網絡服務器程序編寫

在Linux下分析Socket多併發各類實現模型的效率分析:

1  阻塞模型  在數據接收時等待、等待數據從內核內存copy到用戶內存中等待時會卡住

2  非阻塞模型  在等待數據從內核內存copy到用戶內存中等待時會卡住

3  同步/O多路複用  就是咱們說的select,poll,epoll,有些地方也成這種IO方式爲event driven IO。select/epoll的好處就是在於單個process就能夠同時處理多個網絡鏈接的IO。它的基本原理就是select,poll,epoll這個function會不斷的輪訓所負責的全部socket,當某個socket有數據到達了,就通知用戶進程。

4  信號驅動IO  在請求數據時,給予請求,不須要等待,能夠作其餘事情,帶請求數據準備好了,回送一個信號以驅動再次過來取數據。

5  異步IO  其實用的不多,先看一下它的進程:

  只需告知要求數據的請求,而後請求進程就能夠去作本身的事情,服務器會幫助請求數據,數據從系統內核轉存到用戶內存,而後送給請求的進程,最後給進程發送一個完成的信號。效率達到最高。

 

異步IO實例:select解析Socket實例  請參見80180814 

      另外一種實現:用selectors實現

本節做業:  用select或者selectors完成FTP上傳下載的多併發效果

相關文章
相關標籤/搜索