1. 程式人生 > >python 簡單搭建阻塞式單進程,多進程,多線程服務

python 簡單搭建阻塞式單進程,多進程,多線程服務

ets args oca 多線程 accept 客戶端連接 def read div

我們可以通過這樣子的方式去理解apache的工作原理

1 單進程TCP服務(堵塞式)
  這是最原始的服務,也就是說只能處理個客戶端的連接,等當前客戶端關閉後,才能處理下個客戶端,是屬於阻塞式等待

from socket import *
serSocket = socket(AF_INET, SOCK_STREAM)
#重復使用綁定的信息
serSocket.setsockopt(SOL_SOCKET, SO_REUSEADDR , 1)

localAddr = (‘‘, 7788)
serSocket.bind(localAddr)

serSocket.listen(5)

while
True: print(-----主進程,等待客戶端連接------) newSocket,destAddr = serSocket.accept() print(-----.主進程,接下來負責數據處理[%s]-----%str(destAddr)) try: while True: recvData = newSocket.recv(1024) if len(recvData)>0: print(recv[%s]:%s%(str(destAddr), recvData))
else: print([%s]客戶端已經關閉...%str(destAddr)) break finally: newSocket.close()

這種阻塞型自然不適合處理多客戶端的請求,於是有了改版

2 多進程服務

采取多進程處理多客戶端連接請求,對單進程進行了優化。

from socket import *
from multiprocessing import *
from time import sleep
# 處理客戶端的請求並為其服務
def dealWithClient(newSocket,destAddr):
    
while True: recvData = newSocket.recv(1024) if len(recvData)>0: print(recv[%s]:%s%(str(destAddr), recvData)) else: print([%s]客戶端已經關閉%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(-----主進程,,等待新客戶端的到來------) newSocket,destAddr = serSocket.accept() print(-----主進程,,接下來創建.個新的進程負責數據處理[%s]----- client = Process(target=dealWithClient, args=(newSocket,destAddr)) client.start() #因為已經向.進程中copy了.份(引.),並且.進程中這個套接字也沒有用處了 #所以關閉 newSocket.close() finally: #當為所有的客戶端服務完之後再進.關閉,表示不再接收新的客戶端的鏈接 serSocket.close() if __name__ == __main__: main()

通過為每個客戶端創建一個進程的方式,能夠同時為多個客戶端進行服務;當客戶端不是特別多的時候,這種方式還行,如果有成百上千個,就不可取了,因為每次創建進程都消耗較多的資源,於是有了改進版

3 多線程服務

采用多線程處理多客戶端連接請求,由於線程共享資源,不用像進程那樣復制出多個資源,因此處理更快。

#coding=utf-8
from socket import *
from threading import Thread
from time import sleep

# 處理客戶端的請求並執行
def dealWithClient(newSocket,destAddr):
    while True:
        recvData = newSocket.recv(1024)
        if len(recvData)>0:
            print(recv[%s]:%s%(str(destAddr), recvData))
        else:
            print([%s]客戶端已經關閉%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(-----主進程,,等待新客戶端的到來------)
            newSocket,destAddr = serSocket.accept()
            print(-----主進程,,接下來創建.個新的進程負責數據處理[%s]-----
            client = Thread(target=dealWithClient, args=(newSocket,destAddr))
            client.start()

            #這裏不要關閉,線程共享資源,關閉了會導致全部線程均關閉
            #newSocket.close()
    finally:
        serSocket.close()
if __name__ == __main__:
main()

python 簡單搭建阻塞式單進程,多進程,多線程服務