非同步io和協程

2022-04-10 20:46:50 字數 2542 閱讀 5269

常見的非同步io模組asyncio、gevent、twisted、tornado

核心技術為select()和協程

非同步io請求的本質則是【非阻塞socket】+【io多路復用】

協程在這裡不是乙個必須使用的技術,在使用select()事件驅動迴圈本身就可以達到單執行緒非同步的效果

io協程在遇到阻塞時進行切換,其實現需要依賴select()事件迴圈進行切換

協程本質是一種上下文切換技術,通過生成器yield記錄狀態的特性來實現

r,w,e = select.select([rlist],[wlist],[error],timeout)

select:採用事件輪詢方式,即在while true下不斷輪詢所有的socket,

某個socket有資料返回時通知使用者程序,最大輪詢事件為1024,可以跨平台,水平觸發

poll:方式相同,沒有最大輪詢事件數量限制

epoll:方式不同,比如100個連線,有兩個活躍了,epoll會告訴使用者這兩個兩個活躍了,直接取就ok了,而select是迴圈一遍。

select/epoll的優勢並不是對於單個連線能處理得更快,而是在於能處理更多的連線。

如果處理的連線數不是很高的話,使用select/epoll的web server不一定比使用multi-threading + blocking io

的web server效能更好,可能延遲還更大。

非同步io客戶端

生產者消費者的例子,yield from的簡單用法

yield from用來向生成器(協程)傳送資料 ,等價於for i in generator(): yield i

v= yield from  ,v為generator()的返回值

1

defconsumer_work():

2 i=''

3while

true:

4 n = yield

5if n is

none:

6break

7print('

吃了包子%s

' %n)

8return

'end'9

10def

consumer(con):

11while

true:

12 v = yield

from

con13

print

(v)14

15def

producer(c):

16next(c)

17for i in range(10):

18print('

生產了包子%s

' %i)

19c.send(i)

20c.send(none)

2122

23 con =consumer_work()

24 c =consumer(con)

25 producer(c)

生產者消費者

Python中的非同步IO和協程

python中的協程是通過 生成器 generator 的概念實現的。這裡引用廖雪峰python教程中的例子,並做一點修改和 裝飾 def consumer print consumer init consumer r init ok 初始化返回結果,並在啟動消費者時,返回給生產者 while tr...

非同步I O 協程

什麼是協程呢?協程 coroutines 是一種比執行緒更加輕量級的存在,正如乙個程序可以擁有多個執行緒一樣,乙個執行緒可以擁有多個協程。協程不是被作業系統核心所管理的,而是完全由程式所控制,也就是在使用者態執行。這樣帶來的好處是效能大幅度的提公升,因為不會像執行緒切換那樣消耗資源。協程不是程序也不...

非同步IO 協程回顧yield from

咱先看看yield和yield form 的區別在哪兒,如下,全部傳入range 10 def g1 iterable yield iterable def g2 iterable yield from iterable for value in g1 range 10 print value fo...