500 lines 是個不錯的大牛編寫程序稠肘,值得好好學(xué)習(xí),web爬蟲這個項目需要爬取page的所有l(wèi)ink项阴,采用異步并發(fā)的操作。
異步并發(fā)的設(shè)計
由于connection的量會比較大环揽,所以需要選擇高效的高并發(fā)處理操作。
如果采用多線程歉胶,一個進程多個線程會導(dǎo)致線程之間頻繁切換,效率低,還耗電通今。
可以采用select,epoll的異步非阻塞IO,并在請求回來數(shù)據(jù)后衡创,異步調(diào)用回調(diào)函數(shù)。這樣耗費的資源比較低璃氢。
雖然如此,但是還不夠高效一也,最后一把利器,協(xié)程椰苟。協(xié)程就是用戶執(zhí)行態(tài)的程序間切換。python的實現(xiàn)用到了yield 迭代器的next(),send()方法.
@asyncio.coroutine aiohttp.clientSession
如果想深入了解異步并發(fā)舆蝴,關(guān)鍵詞:aiohttp, asyncio,yield
##測試性能比較快的sanic+uvloop
from sanic import Sanic
from sanic.response import json
app = Sanic(__name__)
@app.route('/get')
async def test(request):
a = request.args.get('a')
return json({'args': {'a': a}})
if __name__ == '__main__':
app.run(host='127.0.0.1', port=8000)
代碼風(fēng)格
- 日志打印
以文件為模塊,打印日志题诵,一個模塊僅有唯一的全局變量logger句柄
LOGGER = logging.getLogger(__nam__)
輸出類型可選,LOGGER.info(),LOGGER.error
- 參數(shù)有多個的時候應(yīng)該換行