亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

python 實現(xiàn)socket服務端并發(fā)的四種方式

 更新時間:2020年12月14日 16:57:55   作者:the3times  
這篇文章主要介紹了python 實現(xiàn)socket服務端并發(fā)的四種方式,幫助大家更好的理解和使用python,感興趣的朋友可以了解下

多進程&多線程

服務端:多進程和多線程的開啟方式相同。

缺點:<1> 由于Cpython的GIL,導致同一時間無法運行多個線程;<2> 不可能無限開進進程或線程

解決辦法:多進程、concurrent.futures.ProcessPoolExecutor、線程池

import socket
from multiprocessing import Process
from threading import Thread


class MyTcpServer:
  def __init__(self, ip, port):
    self.ip = ip
    self.port = port
    self.server = socket.socket()
    self.server.bind((self.ip, self.port))
    self.server.listen(5)

  def wait_accept(self):
    conn, addr = self.server.accept()
    return conn, addr

  def handle_request(self, conn):
    while 1:
      try:
        data = conn.recv(1024)
        if not data: break
        conn.send(data.upper())
      except Exception as e:
        print(e)
        break
    conn.close()


if __name__ == '__main__':
  server = MyTcpServer('127.0.0.1', 8888)
  while 1:
    conn, addr = server.wait_accept()
    p = Process(target=server.handle_request, args=(conn, ))	# 創(chuàng)建一個進程
    p.start()	# 告訴操作提供,開啟這個進程

進程池&線程池

異步提交任務,支持異步接收返回結(jié)果(submit返回一個futures對象,調(diào)用add_done_callback方法)

import socket
from concurrent.futures import ProcessPoolExecutor
# from concurrent.futures import ThreadPoolExecutor


class MyTcpServer:
  def __init__(self, ip, port):
    self.ip = ip
    self.port = port
    self.server = socket.socket()
    self.server.bind((self.ip, self.port))
    self.server.listen(5)

  def wait_accept(self):
    conn, addr = self.server.accept()
    return conn, addr

  def handle_request(self, conn):
    while 1:
      try:
        data = conn.recv(1024)
        if not data: break
        conn.send(data.upper())
      except Exception as e:
        print(e)
        break
    conn.close()


if __name__ == '__main__':
  server = MyTcpServer('127.0.0.1', 8888)
  pool = ProcessPoolExecutor(5)    # 5個進程一直服務

  while 1:
    conn, addr = server.wait_accept()
    pool.submit(server.handle_request, conn)	# 異步提交任務

socketserver

優(yōu)點:簡化socket服務端創(chuàng)建流程。
提供服務端串行和并發(fā)兩種服務模式(TCPServer,ThreadingTCPServer)
缺點:windows上無法使用多進程實現(xiàn)并發(fā)

import socketserver


class MyTcpHandler(socketserver.BaseRequestHandler):
  def handle(self):		# 通信循環(huán)
    while 1:
      try:
        data = self.request.recv(1024)
        if not data: break
        self.request.send(data.upper())
      except Exception as e:
        print(e)
        break
    self.request.close()


if __name__ == '__main__':
  ip_port = '127.0.0.1', 8888
  server = socketserver.ThreadingTCPServer(ip_port, MyTcpHandler) # 異步處理 
  server.serve_forever()		# 連接循環(huán)

協(xié)程

優(yōu)點:單線程內(nèi)實現(xiàn)并發(fā),代碼級別模擬IO切換,提高程序運行效率

from gevent import spawn, monkey;monkey.patch_all()		# 猴子補丁,補丁:常規(guī)IO
import socket


class MyTcpServer:
  def __init__(self, ip, port, my_spawn):
    self.ip = ip
    self.port = port
    self.server = socket.socket()
    self.server.bind((self.ip, self.port))
    self.server.listen(5)
    self.spawn = my_spawn		# 保存spawn本地

  def wait_accept(self):
    while 1:
      conn, addr = self.server.accept()
      self.spawn(self.handle_request, conn)	# 檢測 handle_request的io

  def handle_request(self, conn):
    while 1:
      try:
        data = conn.recv(1024)
        if not data: break
        conn.send(data.upper())
      except Exception as e:
        print(e)
        break
    conn.close()


if __name__ == '__main__':
  server = MyTcpServer('127.0.0.1', 8888, spawn)
  g1 = server.spawn(server.wait_accept)	# 檢測wait_accept的io
  g1.join()	# 等待g1運行結(jié)束,即一直在循環(huán)檢測io

以上就是python 實現(xiàn)socket服務端并發(fā)的四種方式的詳細內(nèi)容,更多關(guān)于python socket服務端并發(fā)的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Flask??request?對象介紹

    Flask??request?對象介紹

    本文介紹?Flask??request?對象,一個完整的?HTTP?請求,包括客戶端向服務端發(fā)送的Request?請求和服務器端發(fā)送?Response?響應.為了能方便訪問獲取請求及響應報文信息,Flask?框架提供了一些內(nèi)建對象,下面就來說一下?Flask?針對請求提供內(nèi)建對象reques,需要的朋友可以參考一下
    2021-11-11
  • Python3操作SQL Server數(shù)據(jù)庫(實例講解)

    Python3操作SQL Server數(shù)據(jù)庫(實例講解)

    下面小編就為大家?guī)硪黄狿ython3操作SQL Server數(shù)據(jù)庫(實例講解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • python b站視頻下載的五種版本

    python b站視頻下載的五種版本

    該項目用于Bilibili(b站)視頻下載(支持分P多段視頻的下載),基于python開發(fā),有此需求的朋友可以參考下
    2021-05-05
  • 在Python中使用HTML模版的教程

    在Python中使用HTML模版的教程

    這篇文章主要介紹了在Python中使用HTML模版的教程,HTML模版也是Python的各大框架下的一個基本功能,需要的朋友可以參考下
    2015-04-04
  • Python中copy和deepcopy的使用分析

    Python中copy和deepcopy的使用分析

    這篇文章主要介紹了Python中copy和deepcopy的使用,淺拷貝等于賦值,也可以通過copy實現(xiàn),copy僅拷貝對象本身,deepcopy是真正意義上的復制,深拷貝,被復制對象完全復制一遍作為獨立的新個體,新開辟一塊空間,需要詳細了解的朋友可以參考下
    2021-10-10
  • 多個應用共存的Django配置方法

    多個應用共存的Django配置方法

    今天小編就為大家分享一篇多個應用共存的Django配置方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • PyPDF2讀取PDF文件內(nèi)容保存到本地TXT實例

    PyPDF2讀取PDF文件內(nèi)容保存到本地TXT實例

    這篇文章主要介紹了PyPDF2讀取PDF文件內(nèi)容保存到本地TXT實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-05-05
  • python 批量將中文名轉(zhuǎn)換為拼音

    python 批量將中文名轉(zhuǎn)換為拼音

    這篇文章主要介紹了python 批量將中文名轉(zhuǎn)換為拼音,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2021-02-02
  • Python后臺開發(fā)Django的教程詳解(啟動)

    Python后臺開發(fā)Django的教程詳解(啟動)

    這篇文章主要介紹了Python后臺開發(fā)Django(啟動),本文給大家介紹的非常詳細,具有一定的參考借鑒價值 ,需要的朋友可以參考下
    2019-04-04
  • python中for循環(huán)的多種使用實例

    python中for循環(huán)的多種使用實例

    for語句是Python中執(zhí)行迭代的兩個語句之一,另一個語句是while,下面這篇文章主要給大家介紹了關(guān)于python中for循環(huán)的多種使用方法,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-09-09

最新評論