python aiohttp創(chuàng)建很多線程的問題及解決
python aiohttp創(chuàng)建很多線程
最近使用 python aiohttp 進(jìn)行異步的發(fā)送請求,在命令行中 用py-spy 來監(jiān)控了一下 發(fā)現(xiàn) 運(yùn)行python程序 創(chuàng)建了 125 線程,嚇了我一跳。
解決
Google了很久 找到解決方法了。
原因
每次發(fā)送請求時 aiohttp.ClientSession 查詢dns 。這個查詢dns是阻塞的,所以它每次查詢dns時開啟一個線程的。
所以我在代碼里 給它指定了 dns查詢對象 起作用了。
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)行程序時 有可能提示 需要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
然后編寫一個HTTP服務(wù)器,分別處理以下URL:
/
- 首頁返回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()
也是一個coroutine
,loop.create_server()
則利用asyncio
創(chuàng)建TCP服務(wù)。
總結(jié)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Pandas數(shù)據(jù)形狀df.shape的實(shí)現(xiàn)
本文主要介紹了Pandas數(shù)據(jù)形狀df.shape的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07Python中使用haystack實(shí)現(xiàn)django全文檢索搜索引擎功能
django是python語言的一個web框架,功能強(qiáng)大。配合一些插件可為web網(wǎng)站很方便地添加搜索功能。下面通過本文給大家分享Python中使用haystack實(shí)現(xiàn)django全文檢索搜索引擎功能,感興趣的朋友一起看看吧2017-08-08python+selenium打印當(dāng)前頁面的titl和url方法
今天小編就為大家分享一篇python+selenium打印當(dāng)前頁面的titl和url方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-06-06django實(shí)現(xiàn)模板中的字符串文字和自動轉(zhuǎn)義
這篇文章主要介紹了django實(shí)現(xiàn)模板中的字符串文字和自動轉(zhuǎn)義,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03