国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

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

2020-01-04 16:26:56
字體:
來源:轉載
供稿:網友

我們可以通過這樣子的方式去理解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('-----D主進程,等待客戶端連接酣------') newSocket,destAddr = serSocket.accept() print('-----D.主進程,接下來負責數據處理[%s]-----'%str(destAddr)) try:  while True:  recvData = newSocket.recv(1024)  if len(recvData)>0:   print('recv[%s]:%s'%(str(destAddr), recvData))  else:   print('[%s]客戶端已經關閉w...'%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-8from socket import *from threading import Threadfrom 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 簡單搭建阻塞式單進程,多進程,多線程服務的實例就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到python教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 双辽市| 苍山县| 双鸭山市| 南和县| 航空| 那坡县| 山西省| 陵水| 宁远县| 波密县| 彰化县| 南昌县| 金昌市| 克拉玛依市| 布尔津县| 九龙城区| 紫金县| 卓资县| 荥经县| 根河市| 南阳市| 潼关县| 石楼县| 江西省| 安远县| 翁源县| 阿坝县| 桂平市| 丰顺县| 会东县| 淅川县| 石嘴山市| 岗巴县| 全南县| 黄龙县| 邮箱| 赤峰市| 沿河| 浙江省| 竹溪县| 英山县|