python 系统架构_Python之优化系统架构的方案
方案3: 改變系統(tǒng)架構(gòu)
在開(kāi)始多進(jìn)程之前,先簡(jiǎn)單說(shuō)明一下python GIL, 之前自己對(duì)他也有些誤解。因?yàn)閜ython GIL的機(jī)制存在,同時(shí)運(yùn)行的線程只有一個(gè),但這個(gè)線程在不同時(shí)刻可以運(yùn)行在不同的核上,這個(gè)調(diào)度是由操作系統(tǒng)完成的,如果你寫(xiě)個(gè)死循環(huán),開(kāi)的線程足夠多,是可以把整個(gè)系統(tǒng)的CPU消耗干凈的,此時(shí)你在Linux下通過(guò)top可以看到,us 占用的CPU不大,但sy占用的CPU會(huì)很大,CPU主要消耗在系統(tǒng)調(diào)度上了。下面是測(cè)試代碼,大家可以試試。
import threading
class MultipleThread(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
def run(self):
while 1:
print "here"
for i in xrange(100):
multiple_thread=MultipleThread()
multiple_thread.start()
multiple_thread.join()
既然因?yàn)镚IL的存在,同時(shí)只能運(yùn)行一個(gè)線程,那多線程可以提高效率,當(dāng)然可以!開(kāi)個(gè)3-4個(gè)線程可以明顯的提高性能,大概能提高個(gè)2-3倍左右吧,但繼續(xù)增加線程就是副作用了。
系統(tǒng)多線程的系統(tǒng)架構(gòu):
發(fā)送和接受都不存在瓶頸,主要瓶頸在在紅線部分,decode和 encode部分。多線程改成多進(jìn)程比較簡(jiǎn)單,工作量不大,只要把需要多進(jìn)程共享的信息,由Queue改成multiprocessing.Queue()就可以了,把繼承的DiameterMsgParser(threading.Thread)改成DiameterMsgParser(multiprocessing.Process),有個(gè)比較麻煩的是log的輸出,python自帶的logging模塊在多進(jìn)程下寫(xiě)同一個(gè)文件會(huì)引起混亂。這個(gè)在后面單獨(dú)說(shuō)明。
import multiprocessing
import logging
class Worker(multiprocessing.Process):
def __init__(self,mp_name,input_queue):
multiprocessing.Process.__init__(self,name=mp_name)
self.input_queue=input_queue
def run(self):
for i in xrange(100):
self.input_queue.put_nowait(i)
logging.debug("test?"+str(i))
多線程改成多進(jìn)程后,在sunfire 4170 (16 core , 2.4G ) 上能支持到5000 meesages (雙向), CPU占有率 30-40%,用的是標(biāo)準(zhǔn)的python2.7,因?yàn)樵趕olaris上沒(méi)安裝成功pypy,所以在此機(jī)器上,我沒(méi)有測(cè)試pypy對(duì)性能影響多大。但我在一個(gè)2核的linux機(jī)器上測(cè)試python和 pypy,在多進(jìn)程的情況下的效率,pypy對(duì)效率的提升沒(méi)有達(dá)到倍數(shù)的級(jí)別,沒(méi)找到什么原因, 后面有CPU核數(shù)比較多的機(jī)器再測(cè)試下。
本文由職坐標(biāo)整理并發(fā)布,希望對(duì)同學(xué)們有所幫助。了解更多詳情請(qǐng)關(guān)注職坐標(biāo)編程語(yǔ)言之Python!
總結(jié)
以上是生活随笔為你收集整理的python 系统架构_Python之优化系统架构的方案的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: bs4 乱码_Python Beauti
- 下一篇: websocket python爬虫_p