多進程:編程
多線程和多進程的區別:服務器
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上傳下載的多併發效果