常見的非同步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
(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...