Python實(shí)現(xiàn)的多進(jìn)程和多線(xiàn)程功能示例
本文實(shí)例講述了Python實(shí)現(xiàn)的多進(jìn)程和多線(xiàn)程功能。分享給大家供大家參考,具體如下:
聽(tīng)了朋友說(shuō)起,他們目前開(kāi)發(fā)的測(cè)試框架,用python實(shí)現(xiàn)的分布式系統(tǒng)。雖然python的執(zhí)行效率沒(méi)有c和c++那么高,但是依靠集群的力量,產(chǎn)生的壓力很是牛逼啊。
了解了下大概的方式就是
1、有臺(tái)主控機(jī),負(fù)責(zé)調(diào)度,比如執(zhí)行的參數(shù)等
2、有n多臺(tái)執(zhí)行機(jī),每個(gè)執(zhí)行機(jī)上部署一個(gè)python的xmlRPC server,主控機(jī)調(diào)用rpccall,然后執(zhí)行機(jī)執(zhí)行。rpccall里面會(huì)fork一些進(jìn)程,每個(gè)進(jìn)程再創(chuàng)建一些線(xiàn)程,去調(diào)用測(cè)試方法。這樣,擴(kuò)展性就很好了。
對(duì)于python的rpc call,之前也沒(méi)有接觸過(guò),不是很了解,google了一下,發(fā)現(xiàn)很簡(jiǎn)單,拿了個(gè)網(wǎng)上的例子,如下,先部署一個(gè)rpcServer
from SimpleXMLRPCServer import SimpleXMLRPCServer def add(a , b): return a+bserver = SimpleXMLRPCServer(("10.249.192.38", 8000))#這里不要用localhost,否則只有本機(jī)才能訪(fǎng)問(wèn) server.register_function(add) server.serve_forever()
客戶(hù)端:
from xmlrpclib import Server Proxyserver = ServerProxy("http://localhost:8000") try: ret = server.add(30,90) print 'result:', ret print 'result type:', type(ret) except Exception, e: print "exception",e
其實(shí)還是很簡(jiǎn)單的。
然后再看了下python的多進(jìn)程和多線(xiàn)程的方法,寫(xiě)了個(gè)例子,如下:
#encoding=utf-8 import sys import os import time import pdb import httplib import thread import threading constant_p = 0 #創(chuàng)建全局變量,進(jìn)程數(shù) constant_s = 0 #創(chuàng)建全局變量,線(xiàn)程數(shù) mutex_g = threading.RLock() #創(chuàng)建全局鎖 def run(count):#該函數(shù)創(chuàng)建3個(gè)線(xiàn)程,同時(shí)調(diào)用3個(gè)不同的函數(shù) a = 1 b = 0 thread.start_new_thread(test0,(a,b))#這里傳入的參數(shù)需要以元組的形式,跟void指針其實(shí)也差不多 thread.start_new_thread(test1,(a,b)) thread.start_new_thread(test2,(a,b)) def test0(a,b): global mutex_g global constant_s threadid = thread.get_ident() mutex_g.acquire()#這里需要把線(xiàn)程數(shù)說(shuō)鎖起來(lái),否則結(jié)果會(huì)被修改 constant_s = constant_s+1 mutex_g.release() print "thread 0 called,and the threadid is:%d"%(threadid) sys.exit(0) def test1(a,b): global mutex_g global constant_s threadid = thread.get_ident() mutex_g.acquire() constant_s = constant_s+1 mutex_g.release() print "thread 1 called,and the threadid is:%d"%(threadid) sys.exit(0) def test2(a,b): global mutex_g global constant_s threadid = thread.get_ident() mutex_g.acquire() constant_s = constant_s+1 mutex_g.release() print "thread 2 called,and the threadid is:%d"%(threadid) sys.exit(0) def my_fork(): global constant_p pid = os.fork()#fork一個(gè)子進(jìn)程,子進(jìn)程的pid=0同時(shí)2個(gè)進(jìn)程會(huì)執(zhí)行my_fork()函數(shù) if (pid == 0):#子進(jìn)程執(zhí)行到這個(gè)if里面 constant_p = constant_s + 1 run(3) time.sleep(5) print "total thread is %d"%constant_s#這個(gè)結(jié)果是3,因?yàn)樽舆M(jìn)程創(chuàng)建按了3個(gè)線(xiàn)程 elif (pid >0):#父進(jìn)程執(zhí)行到這個(gè)if里面 constant_p = constant_s + 1 run(4) time.sleep(5) print "total thread is %d"%constant_s#這個(gè)結(jié)果也是3,因?yàn)樵撨M(jìn)程也創(chuàng)建了3個(gè)線(xiàn)程 else: print "fork error" sys.exit(0) print "total process is %d"%constant_p#該結(jié)果是1,因?yàn)?個(gè)進(jìn)程只執(zhí)行了一次 constant_p = constant_s + 1 sys.exit(0) if __name__ == "__main__": my_fork() #my_fork() #my_fork()
更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《Python進(jìn)程與線(xiàn)程操作技巧總結(jié)》、《Python Socket編程技巧總結(jié)》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》、《Python入門(mén)與進(jìn)階經(jīng)典教程》及《Python文件與目錄操作技巧匯總》
希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。
- python 多進(jìn)程和多線(xiàn)程使用詳解
- Python全局鎖中如何合理運(yùn)用多線(xiàn)程(多進(jìn)程)
- python線(xiàn)程安全及多進(jìn)程多線(xiàn)程實(shí)現(xiàn)方法詳解
- Python實(shí)現(xiàn)多線(xiàn)程/多進(jìn)程的TCP服務(wù)器
- python多線(xiàn)程與多進(jìn)程及其區(qū)別詳解
- Python實(shí)現(xiàn)的服務(wù)器示例小結(jié)【單進(jìn)程、多進(jìn)程、多線(xiàn)程、非阻塞式】
- Python中單線(xiàn)程、多線(xiàn)程和多進(jìn)程的效率對(duì)比實(shí)驗(yàn)實(shí)例
- Python多線(xiàn)程處理實(shí)例詳解【單進(jìn)程/多進(jìn)程】
- Python并發(fā):多線(xiàn)程與多進(jìn)程的詳解
- Python多線(xiàn)程與多進(jìn)程相關(guān)知識(shí)總結(jié)
相關(guān)文章
Python基于回溯法子集樹(shù)模板解決馬踏棋盤(pán)問(wèn)題示例
這篇文章主要介紹了Python基于回溯法子集樹(shù)模板解決馬踏棋盤(pán)問(wèn)題,簡(jiǎn)單描述了國(guó)際象棋馬踏棋盤(pán)問(wèn)題,并結(jié)合實(shí)例形式分析了Python使用回溯法子集樹(shù)模板解決馬踏棋盤(pán)問(wèn)題的具體步驟與相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2017-09-09樹(shù)莓派用python中的OpenCV輸出USB攝像頭畫(huà)面
這篇文章主要為大家詳細(xì)介紹了樹(shù)莓派用python中的OpenCV輸出USB攝像頭畫(huà)面,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-06-06Cpython編譯后再使用Pyinstaller打包的詳細(xì)教程
pyinstaller是一個(gè)第三方庫(kù),它能夠在Windows、Linux、 Mac OS X 等操作系統(tǒng)下將 Python 源文件打包,通過(guò)對(duì)源文件打包,這篇文章主要介紹了Cpython編譯后再使用Pyinstaller打包的詳細(xì)教程,需要的朋友可以參考下2023-11-11利用python繪制數(shù)據(jù)曲線(xiàn)圖的實(shí)現(xiàn)
這篇文章主要介紹了利用python繪制數(shù)據(jù)曲線(xiàn)圖的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04Python基于numpy靈活定義神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)的方法
這篇文章主要介紹了Python基于numpy靈活定義神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)的方法,結(jié)合實(shí)例形式分析了神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)的原理及Python具體實(shí)現(xiàn)方法,涉及Python使用numpy擴(kuò)展進(jìn)行數(shù)學(xué)運(yùn)算的相關(guān)操作技巧,需要的朋友可以參考下2017-08-08tensorboard 可以顯示graph,卻不能顯示scalar的解決方式
今天小編就為大家分享一篇tensorboard 可以顯示graph,卻不能顯示scalar的解決方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-02-02淺析Python+OpenCV使用攝像頭追蹤人臉面部血液變化實(shí)現(xiàn)脈搏評(píng)估
這篇文章主要介紹了Python+OpenCV使用攝像頭追蹤人臉面部血液變化實(shí)現(xiàn)脈搏評(píng)估,本文通過(guò)一段代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-10-10Python虛擬機(jī)之super超級(jí)魔法的使用和工作原理詳解
在本篇文章中,我們將深入探討Python中的super類(lèi)的使用和內(nèi)部工作原理,super類(lèi)作為Python虛擬機(jī)中強(qiáng)大的功能之一,super 可以說(shuō)是 Python 對(duì)象系統(tǒng)基石,他可以幫助我們更靈活地使用繼承和方法調(diào)用,需要的朋友可以參考下2023-10-10