eventlet設計模式

1. 客戶端模式(Client Pattern)

一個權威的客戶端模式就是網絡爬蟲,下面例子列出一些站點URL,並嘗試檢索他們的網頁內容以做後續操作

import eventlet
from eventlet.green import urllib2

urls = ["http://www.google.com/intl/en_ALL/images/logo.gif",
       "https://wiki.secondlife.com/w/images/secondlife.jpg",
       "http://us.i1.yimg.com/us.yimg.com/i/ww/beta/y3.gif"]

def fetch(url):
    return urllib2.urlopen(url).read()

pool = eventlet.GreenPool()
for body in pool.imap(fetch, urls):
    print("got body", len(body))

一個稍微複雜的爬蟲例子:web crawler example

2. 服務端模式(Server Pattern)

下面列出一個簡單的echo服務端

import eventlet

def handle(client):
    while True:
        c = client.recv(1)
        if not c: break
        client.sendall(c)

server = eventlet.listen(('0.0.0.0', 6000))
pool = eventlet.GreenPool(10000)
while True:
    new_sock, address = server.accept()
    pool.spawn_n(handle, new_sock)

一個更加完善的例子:echo server example

3. 分派模式(Dispatch Pattern)

所謂派遣模式就是指,作爲服務器端的同時也是客戶端,Proxies(代理), aggregators(聚合器), job workers(任務執行) 均可以實現。

import eventlet
feedparser = eventlet.import_patched('feedparser')

pool = eventlet.GreenPool()

def fetch_title(url):
    d = feedparser.parse(url)
    return d.feed.get('title', '')

def app(environ, start_response):
    pile = eventlet.GreenPile(pool)
    for url in environ['wsgi.input'].readlines():
        pile.spawn(fetch_title, url)
    titles = '\n'.join(pile)
    start_response('200 OK', [('Content-type', 'text/plain')])
    return [titles]

一個更加完善的例子:Feed Scraper

references

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章