python aiohttp創(chuàng)建很多線程的問(wèn)題及解決
python aiohttp創(chuàng)建很多線程
最近使用 python aiohttp 進(jìn)行異步的發(fā)送請(qǐng)求,在命令行中 用py-spy 來(lái)監(jiān)控了一下 發(fā)現(xiàn) 運(yùn)行python程序 創(chuàng)建了 125 線程,嚇了我一跳。
解決
Google了很久 找到解決方法了。
原因
每次發(fā)送請(qǐng)求時(shí) aiohttp.ClientSession 查詢dns 。這個(gè)查詢dns是阻塞的,所以它每次查詢dns時(shí)開(kāi)啟一個(gè)線程的。
所以我在代碼里 給它指定了 dns查詢對(duì)象 起作用了。
from aiohttp.resolver import AsyncResolver resolver = AsyncResolver() tcp_conn = aiohttp.TCPConnector(resolver=resolver) async with aiohttp.ClientSession(connector=tcp_conn) as session: await process_spider(spider, session)
運(yùn)行程序時(shí) 有可能提示 需要aiodns. 安裝即可: pip install aiodns .
python aiohttp模塊使用
asyncio
可以實(shí)現(xiàn)單線程并發(fā)IO操作。如果僅用在客戶端,發(fā)揮的威力不大。
如果把asyncio
用在服務(wù)器端,例如Web服務(wù)器,由于HTTP連接就是IO操作,因此可以用單線程+coroutine
實(shí)現(xiàn)多用戶的高并發(fā)支持。
asyncio
實(shí)現(xiàn)了TCP、UDP、SSL等協(xié)議,aiohttp
則是基于asyncio
實(shí)現(xiàn)的HTTP框架。
我們先安裝aiohttp
:
pip install aiohttp
然后編寫(xiě)一個(gè)HTTP服務(wù)器,分別處理以下URL:
/
- 首頁(yè)返回b'<h1>Index</h1>'
;/hello/{name}
- 根據(jù)URL參數(shù)返回文本hello, %s!
。
代碼如下:
import asyncio from aiohttp import web async def index(request): await asyncio.sleep(0.5) return web.Response(body=b'<h1>Index</h1>') async def hello(request): await asyncio.sleep(0.5) text = '<h1>hello, %s!</h1>' % request.match_info['name'] return web.Response(body=text.encode('utf-8')) async def init(loop): app = web.Application(loop=loop) app.router.add_route('GET', '/', index) app.router.add_route('GET', '/hello/{name}', hello) srv = await loop.create_server(app.make_handler(), '127.0.0.1', 8000) print('Server started at http://127.0.0.1:8000...') return srv loop = asyncio.get_event_loop() loop.run_until_complete(init(loop)) loop.run_forever()
注意aiohttp
的初始化函數(shù)init()
也是一個(gè)coroutine
,loop.create_server()
則利用asyncio
創(chuàng)建TCP服務(wù)。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Pandas數(shù)據(jù)形狀df.shape的實(shí)現(xiàn)
本文主要介紹了Pandas數(shù)據(jù)形狀df.shape的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07Python中使用haystack實(shí)現(xiàn)django全文檢索搜索引擎功能
django是python語(yǔ)言的一個(gè)web框架,功能強(qiáng)大。配合一些插件可為web網(wǎng)站很方便地添加搜索功能。下面通過(guò)本文給大家分享Python中使用haystack實(shí)現(xiàn)django全文檢索搜索引擎功能,感興趣的朋友一起看看吧2017-08-08python+selenium打印當(dāng)前頁(yè)面的titl和url方法
今天小編就為大家分享一篇python+selenium打印當(dāng)前頁(yè)面的titl和url方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-06-06Python基礎(chǔ)中的的if-else語(yǔ)句詳解
這篇文章主要為大家詳細(xì)介紹了Python基礎(chǔ)中的的if-else語(yǔ)句,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-02-02django實(shí)現(xiàn)模板中的字符串文字和自動(dòng)轉(zhuǎn)義
這篇文章主要介紹了django實(shí)現(xiàn)模板中的字符串文字和自動(dòng)轉(zhuǎn)義,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03