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è)套接字也沒有用處了
#所以關(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返回?cái)?shù)組/List長(zhǎng)度的實(shí)例
今天小編就為大家分享一篇Python返回?cái)?shù)組/List長(zhǎng)度的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-06-06
Python設(shè)計(jì)模式中的結(jié)構(gòu)型適配器模式
這篇文章主要介紹了Python設(shè)計(jì)中的結(jié)構(gòu)型適配器模式,適配器模式即Adapter?Pattern,將一個(gè)類的接口轉(zhuǎn)換成為客戶希望的另外一個(gè)接口,下文內(nèi)容具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-02-02
Python 日期區(qū)間處理 (本周本月上周上月...)
這篇文章主要介紹了Python 日期區(qū)間處理 (本周本月上周上月...),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08
Python 項(xiàng)目轉(zhuǎn)化為so文件實(shí)例
今天小編就為大家分享一篇Python 項(xiàng)目轉(zhuǎn)化為so文件實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12
python中使用sys模板和logging模塊獲取行號(hào)和函數(shù)名的方法
這篇文章主要介紹了python中使用sys模板和logging模塊獲取行號(hào)和函數(shù)名的方法,需要的朋友可以參考下2014-04-04
基于Python實(shí)現(xiàn)西西成語(yǔ)接龍小助手
成語(yǔ)接龍是中華民族傳統(tǒng)的文字游戲。本文將用Python制作一個(gè)簡(jiǎn)單的成語(yǔ)接龍小程序,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-08-08
Python實(shí)現(xiàn)switch/case語(yǔ)句
與Java、C\C++等語(yǔ)言不同,Python中是不提供switch/case語(yǔ)句的,這一點(diǎn)讓我感覺到很奇怪。我們可以通過(guò)如下幾種方法來(lái)實(shí)現(xiàn)switch/case語(yǔ)句2021-08-08
Django中更新多個(gè)對(duì)象數(shù)據(jù)與刪除對(duì)象的方法
這篇文章主要介紹了Django中更新多個(gè)對(duì)象數(shù)據(jù)與刪除對(duì)象的方法,Django是Python重多各色框架中人氣最高的一個(gè),需要的朋友可以參考下2015-07-07

