最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

多進(jìn)程&多線程

服務(wù)端:多進(jìn)程和多線程的開(kāi)啟方式相同。

缺點(diǎn):<1> 由于Cpython的GIL,導(dǎo)致同一時(shí)間無(wú)法運(yùn)行多個(gè)線程;<2> 不可能無(wú)限開(kāi)進(jìn)進(jìn)程或線程

解決辦法:多進(jìn)程、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)建一個(gè)進(jìn)程
    p.start()	# 告訴操作提供,開(kāi)啟這個(gè)進(jìn)程

進(jìn)程池&線程池

異步提交任務(wù),支持異步接收返回結(jié)果(submit返回一個(gè)futures對(duì)象,調(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個(gè)進(jìn)程一直服務(wù)

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

socketserver

優(yōu)點(diǎn):簡(jiǎn)化socket服務(wù)端創(chuàng)建流程。
提供服務(wù)端串行和并發(fā)兩種服務(wù)模式(TCPServer,ThreadingTCPServer)
缺點(diǎn):windows上無(wú)法使用多進(jìn)程實(shí)現(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)點(diǎn):?jiǎn)尉€程內(nèi)實(shí)現(xiàn)并發(fā),代碼級(jí)別模擬IO切換,提高程序運(yùn)行效率

from gevent import spawn, monkey;monkey.patch_all()		# 猴子補(bǔ)丁,補(bǔ)丁:常規(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)	# 檢測(cè) 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)	# 檢測(cè)wait_accept的io
  g1.join()	# 等待g1運(yùn)行結(jié)束,即一直在循環(huán)檢測(cè)io

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

相關(guān)文章

  • 深入探究python中Pandas庫(kù)處理缺失數(shù)據(jù)和數(shù)據(jù)聚合

    深入探究python中Pandas庫(kù)處理缺失數(shù)據(jù)和數(shù)據(jù)聚合

    在本篇文章中,我們將深入探討Pandas庫(kù)中兩個(gè)重要的數(shù)據(jù)處理功能:處理缺失數(shù)據(jù)和數(shù)據(jù)聚合,文中有詳細(xì)的代碼示例,對(duì)我們的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2023-07-07
  • 使用PyInstaller?打包配置文件

    使用PyInstaller?打包配置文件

    這篇文章主要介紹了使用PyInstaller?打包配置文件,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • Python的psutil模塊詳解

    Python的psutil模塊詳解

    psutil是一個(gè)跨平臺(tái)庫(kù),能夠輕松實(shí)現(xiàn)獲取系統(tǒng)運(yùn)行的進(jìn)程和系統(tǒng)利用率(包括CPU、內(nèi)存、磁盤(pán)、網(wǎng)絡(luò)等)信息,需要的朋友可以參考下
    2023-05-05
  • 簡(jiǎn)單了解python 生成器 列表推導(dǎo)式 生成器表達(dá)式

    簡(jiǎn)單了解python 生成器 列表推導(dǎo)式 生成器表達(dá)式

    這篇文章主要介紹了簡(jiǎn)單了解python 生成器 列表推導(dǎo)式 生成器表達(dá)式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • python數(shù)據(jù)處理之如何選取csv文件中某幾行的數(shù)據(jù)

    python數(shù)據(jù)處理之如何選取csv文件中某幾行的數(shù)據(jù)

    這篇文章主要給大家介紹了關(guān)于python數(shù)據(jù)處理之如何選取csv文件中某幾行的數(shù)據(jù)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • python列表的切片賦值實(shí)現(xiàn)

    python列表的切片賦值實(shí)現(xiàn)

    Python列表切片賦值是一種將一個(gè)列表的特定部分替換為新的元素的操作,本文主要介紹了python列表的切片賦值實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • Python企業(yè)編碼生成系統(tǒng)總體系統(tǒng)設(shè)計(jì)概述

    Python企業(yè)編碼生成系統(tǒng)總體系統(tǒng)設(shè)計(jì)概述

    這篇文章主要介紹了Python企業(yè)編碼生成系統(tǒng)總體系統(tǒng)設(shè)計(jì),簡(jiǎn)單描述了Python企業(yè)編碼生成系統(tǒng)的功能、結(jié)構(gòu)與相關(guān)編碼實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2019-07-07
  • python2.7實(shí)現(xiàn)FTP文件下載功能

    python2.7實(shí)現(xiàn)FTP文件下載功能

    這篇文章主要為大家詳細(xì)介紹了python 2.7 實(shí)現(xiàn)FTP文件下載功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • Python中POST調(diào)用Restful接口示例

    Python中POST調(diào)用Restful接口示例

    這篇文章主要介紹了Python之POST調(diào)用Restful接口示例,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-02-02
  • 淺談python中的實(shí)例方法、類(lèi)方法和靜態(tài)方法

    淺談python中的實(shí)例方法、類(lèi)方法和靜態(tài)方法

    本文主要介紹了python 實(shí)例方法、類(lèi)方法和靜態(tài)方法的相關(guān)知識(shí)。具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧
    2017-02-02

最新評(píng)論

宁陵县| 龙井市| 南涧| 延寿县| 都安| 鄂州市| 永登县| 三亚市| 本溪| 大港区| 鹿邑县| 渝北区| 阿合奇县| 萨嘎县| 奎屯市| 山阴县| 崇仁县| 宝山区| 诏安县| 海伦市| 明光市| 克什克腾旗| 黄冈市| 广灵县| 资中县| 漳平市| 米林县| 鸡西市| 吉隆县| 凤城市| 北流市| 定边县| 江山市| 南皮县| 嘉定区| 韶山市| 夹江县| 南郑县| 迁西县| 观塘区| 临夏市|