1. 程式人生 > 實用技巧 >IO多路複用 基於IO的單執行緒併發 協程

IO多路複用 基於IO的單執行緒併發 協程

https://www.cnblogs.com/nianshaoyouwei/p/9642991.html

一. IO多路複用

  檢測多個socket是否已經發生變化(是否已經連線成功/是否已經獲取資料)(可讀/可寫)

  作業系統檢測socket是否發生變化,有三種模式:

      select:最多1024個socket;迴圈去檢測.

      poll:不限制監聽socket個數;迴圈去檢測(水平觸發).

      epoll:不限制監聽socket個數;回撥方式(邊緣觸發).

  Python模組:

      select.select

      select.epoll

二.基於IO多路複用+socket實現併發請求

  IO多路複用+socket非阻塞+捕獲異常(BlockingIOError)

 此方法稱為基於事件迴圈實現的非同步非阻塞框架(非阻塞:不等待 非同步:執行完某個人物後自動呼叫我給他的函式.)

  python中開源模組 Twisted

三.協程.

1.什麼是協程

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

2.協程可以提高併發嗎

  協程自己本身無法實現併發,但協程+IO切換效能可以提高.

3.單執行緒提高併發:

  協程+IO切換:gevent

  基於事件迴圈的非同步非阻塞框架:Twisted

4.手動實現協程:yield關鍵字生成器

    

def f1():
                print(11)
                yield
                print(22)
                yield
                print(33)

            def f2():
                print(55)
                yield
                print(66)
                yield
                print(77)

            v1 = f1()
            v2 = f2()

            next(v1) # v1.send(None)
            next(v2) 
            next(v1) 
            next(v2) 
            next(v1) 
            next(v2)