python之高性能網絡編程並發框架eventlet實例


http://blog.csdn.net/mingzznet/article/details/38388299

前言:

雖然 eventlet 封裝成了非常類似標准線程庫的形式,但線程和eventlet在實際並發執行流程仍然有明顯區別。在沒有出現 I/O 阻塞時,除非顯式聲明,否則當前正在執行的 eventlet 永遠不會把 cpu 交給其他的 eventlet,而標准線程則是無論是否出現阻塞,總是由所有線程一起爭奪運行資源。所有 eventlet 對 I/O 阻塞無關的大運算量耗時操作基本沒有什么幫助。

 

Eventlet 的基礎是 greenlet,這是實現 "協程(Coroutine)" 的基礎.協程又被稱作 "微線程“,簡單點說就是在一個原生線程上通過 "拷貝" 和 "切換" 堆棧幀數據來實現執行多個工作緒.看上去和傳統的 "單CPU,多線程(Threading)" 執行方式差不多. swpan() 啟動一個 GreenThread 執行目標函數,wait() 返回函數執行結果。


 

1
2
3
4
import  eventlet
pool = eventlet.GreenPool()
while  True:
      pool.spawn(func,args )



上面這段代碼,幾乎就是使用eventlet的范式:

GreenPool 用來實現協程,保證並行;

Spawn 用來調用相應的函數,完成具體業務

每個func之間切換,實施“你運行一會、我運行一會”,並且在進行切換時必須指定何時切換以及切換到哪,當出現阻塞時,就顯式切換到另一段沒有被阻塞的代碼段執行,直到原先的阻塞狀況消失以后,再人工切換回原來的代碼段繼續處理.

首先需要安裝eventlet的相關模塊

005927259.jpg

我們先簡單跑一個demo !

011221569.jpg


他的用法其實和threading差不多的,都可以指定pool和函數的。(有點廢話)

為啥叫他網絡編程框架,因為他支持很多底層的東西,比如http,比如socket啥的。

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#! /usr/bin/env python
# -*- coding: UTF- 8  -*-
from eventlet  import  api
def httpd(writer,reader):
     req= ''
     while  True:
         chunk=reader.readline()
         if  not chunk:
             break
         req+=chunk
         if  chunk== '\r\n' :
             break
     data= 'Hello world!\r\n'
     writer.write( 'HTTP/1.1 200 OK\r\nContent-Length: %d\r\n\r\n%s' %(len(data),data))
     writer.close()
     reader.close()
     return
def main():
     try :
         server=api.tcp_listener(( '0.0.0.0' , 3000 ))
         print  'Server started!'
         while  True:
             conn,addr=server.accept()
             #print  'client %s connected!' %repr(addr)
             writer=conn.makefile( 'w' )
             api.spawn(httpd,writer,conn.makefile( 'r' ))
     except KeyboardInterrupt:
         pass
     return
if  __name__== '__main__' :
     main()


咱們來測試下這個用eventlet實現的http吧!

012144447.jpg


客戶端訪問下

012328743.jpg



下面是利用wait()堵塞行為,保證他是同步的運行。

170021439.png


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM