xampp搭建wordpress長沙優(yōu)化網(wǎng)站
Python中GIL的存在,導(dǎo)致多線程一直不是很好用,相形之下,協(xié)程的優(yōu)勢(shì)就更加突出了。
Python通過yield提供了對(duì)協(xié)程的基本支持,但是不完全。而第三方的gevent為Python提供了比較完善的協(xié)程支持。
gevent是第三方庫,通過greenlet實(shí)現(xiàn)協(xié)程,其基本思想是:
當(dāng)一個(gè)greenlet遇到IO操作時(shí),比如訪問網(wǎng)絡(luò),就自動(dòng)切換到其他的greenlet,等到IO操作完成,再在適當(dāng)?shù)臅r(shí)候切換回來繼續(xù)執(zhí)行。由于IO操作非常耗時(shí),經(jīng)常使程序處于等待狀態(tài),有了gevent為我們自動(dòng)切換協(xié)程,就保證總有g(shù)reenlet在運(yùn)行,而不是等待IO。
gevent是基于協(xié)程的Python網(wǎng)絡(luò)庫。特點(diǎn):
- 基于libev的快速事件循環(huán)(Linux上epoll,FreeBSD上kqueue)。
- 基于greenlet的輕量級(jí)執(zhí)行單元。
- API的概念和Python標(biāo)準(zhǔn)庫一致(如事件,隊(duì)列)。
- 可以配合socket,ssl模塊使用。
- 能夠使用標(biāo)準(zhǔn)庫和第三方模塊創(chuàng)建標(biāo)準(zhǔn)的阻塞套接字(gevent.monkey)。
- 默認(rèn)通過線程池進(jìn)行DNS查詢,也可通過c-are(通過GEVENT_RESOLVER=ares環(huán)境變量開啟)。
- TCP/UDP/HTTP服務(wù)器
- 子進(jìn)程支持(通過gevent.subprocess)
- 線程池
由于切換是在IO操作時(shí)自動(dòng)完成,所以gevent需要修改Python自帶的一些標(biāo)準(zhǔn)庫,這一過程在啟動(dòng)時(shí)通過monkey patch完成: