python 簡(jiǎn)單搭建阻塞式單進(jìn)程,多進(jìn)程,多線程服務(wù)的實(shí)例
我們可以通過(guò)這樣子的方式去理解apache的工作原理
1 單進(jìn)程TCP服務(wù)(堵塞式)
這是最原始的服務(wù),也就是說(shuō)只能處理個(gè)客戶端的連接,等當(dāng)前客戶端關(guān)閉后,才能處理下個(gè)客戶端,是屬于阻塞式等待
from socket import * serSocket = socket(AF_INET, SOCK_STREAM) #重復(fù)使用綁定的信息 serSocket.setsockopt(SOL_SOCKET, SO_REUSEADDR , 1) localAddr = ('', 7788) serSocket.bind(localAddr) serSocket.listen(5) while True: print('-----主進(jìn)程,等待客戶端連接------') newSocket,destAddr = serSocket.accept() print('-----.主進(jìn)程,接下來(lái)負(fù)責(zé)數(shù)據(jù)處理[%s]-----'%str(destAddr)) try: while True: recvData = newSocket.recv(1024) if len(recvData)>0: print('recv[%s]:%s'%(str(destAddr), recvData)) else: print('[%s]客戶端已經(jīng)關(guān)閉...'%str(destAddr)) break finally: newSocket.close()
這種阻塞型自然不適合處理多客戶端的請(qǐng)求,于是有了改版
2 多進(jìn)程服務(wù)
采取多進(jìn)程處理多客戶端連接請(qǐng)求,對(duì)單進(jìn)程進(jìn)行了優(yōu)化。
from socket import * from multiprocessing import * from time import sleep # 處理客戶端的請(qǐng)求并為其服務(wù) def dealWithClient(newSocket,destAddr): while True: recvData = newSocket.recv(1024) if len(recvData)>0: print('recv[%s]:%s'%(str(destAddr), recvData)) else: print('[%s]客戶端已經(jīng)關(guān)閉'%str(destAddr)) break newSocket.close() def main(): serSocket = socket(AF_INET, SOCK_STREAM) serSocket.setsockopt(SOL_SOCKET, SO_REUSEADDR , 1) localAddr = ('', 7788) serSocket.bind(localAddr) serSocket.listen(5) try: while True: print('-----主進(jìn)程,,等待新客戶端的到來(lái)------') newSocket,destAddr = serSocket.accept() print('-----主進(jìn)程,,接下來(lái)創(chuàng)建.個(gè)新的進(jìn)程負(fù)責(zé)數(shù)據(jù)處理[%s]-----' client = Process(target=dealWithClient, args=(newSocket,destAddr)) client.start() #因?yàn)橐呀?jīng)向.進(jìn)程中copy了.份(引.),并且.進(jìn)程中這個(gè)套接字也沒(méi)有用處了 #所以關(guān)閉 newSocket.close() finally: #當(dāng)為所有的客戶端服務(wù)完之后再進(jìn).關(guān)閉,表示不再接收新的客戶端的鏈接 serSocket.close() if __name__ == '__main__': main()
通過(guò)為每個(gè)客戶端創(chuàng)建一個(gè)進(jìn)程的方式,能夠同時(shí)為多個(gè)客戶端進(jìn)行服務(wù);當(dāng)客戶端不是特別多的時(shí)候,這種方式還行,如果有成百上千個(gè),就不可取了,因?yàn)槊看蝿?chuàng)建進(jìn)程都消耗較多的資源,于是有了改進(jìn)版
3 多線程服務(wù)
采用多線程處理多客戶端連接請(qǐng)求,由于線程共享資源,不用像進(jìn)程那樣復(fù)制出多個(gè)資源,因此處理更快。
#coding=utf-8 from socket import * from threading import Thread from time import sleep # 處理客戶端的請(qǐng)求并執(zhí)行 def dealWithClient(newSocket,destAddr): while True: recvData = newSocket.recv(1024) if len(recvData)>0: print('recv[%s]:%s'%(str(destAddr), recvData)) else: print('[%s]客戶端已經(jīng)關(guān)閉'%str(destAddr)) break newSocket.close() def main(): serSocket = socket(AF_INET, SOCK_STREAM) serSocket.setsockopt(SOL_SOCKET, SO_REUSEADDR , 1) localAddr = ('', 7788) serSocket.bind(localAddr) serSocket.listen(5) try: while True: print('-----主進(jìn)程,,等待新客戶端的到來(lái)------') newSocket,destAddr = serSocket.accept() print('-----主進(jìn)程,,接下來(lái)創(chuàng)建.個(gè)新的進(jìn)程負(fù)責(zé)數(shù)據(jù)處理[%s]-----' client = Thread(target=dealWithClient, args=(newSocket,destAddr)) client.start() #這里不要關(guān)閉,線程共享資源,關(guān)閉了會(huì)導(dǎo)致全部線程均關(guān)閉 #newSocket.close() finally: serSocket.close() if __name__ == '__main__': main()
以上這篇python 簡(jiǎn)單搭建阻塞式單進(jìn)程,多進(jìn)程,多線程服務(wù)的實(shí)例就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
python自動(dòng)發(fā)送測(cè)試報(bào)告郵件功能的實(shí)現(xiàn)
這篇文章主要介紹了python自動(dòng)發(fā)測(cè)試報(bào)告郵件功能的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-01-01Python人工智能語(yǔ)音合成實(shí)現(xiàn)案例詳解
這篇文章主要為大家介紹了Python人工智能語(yǔ)音合成實(shí)現(xiàn)案例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03詳解Python之?dāng)?shù)據(jù)序列化(json、pickle、shelve)
本篇文章主要介紹了Python之?dāng)?shù)據(jù)序列化,本節(jié)要介紹的就是Python內(nèi)置的幾個(gè)用于進(jìn)行數(shù)據(jù)序列化的模塊,有興趣的可以了解一下。2017-03-03python中進(jìn)程間通信及設(shè)置狀態(tài)量控制另一個(gè)進(jìn)程
這篇文章主要介紹了python中進(jìn)程間通信及設(shè)置狀態(tài)量控制另一個(gè)進(jìn)程,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-05-05用Python進(jìn)行基礎(chǔ)的函數(shù)式編程的教程
這篇文章主要介紹了用Python進(jìn)行基礎(chǔ)的函數(shù)式編程的教程,除了面向?qū)ο缶幊桃馔狻ython還可以進(jìn)行簡(jiǎn)單的不依賴外部變量的函數(shù)式編程,本文介紹了其中的一些基礎(chǔ),需要的朋友可以參考下2015-03-03