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

Python使用異步線程池如何實現(xiàn)異步TCP服務(wù)器交互

 更新時間:2023年11月10日 08:50:23   作者:Rnan-prince  
這篇文章主要介紹了Python使用異步線程池如何實現(xiàn)異步TCP服務(wù)器交互問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

背景

實現(xiàn)客戶端與服務(wù)端交互,由于效率原因,要發(fā)送與接收異步,提高效率。

需要多線程,本文用線程池管理。

common代碼

import pickle
import struct
import time
 
 
def send_msg(conn, data):
    time.sleep(1)
    msg = pickle.dumps(data)
    msg = struct.pack('>I', len(msg)) + msg
    conn.sendall(msg)
    return data, len(msg)
 
 
def recv_from(conn, n):
    data = b''
    handle_len = 0
    while handle_len < n:
        packet = conn.recv(n - handle_len)
        if not packet:
            return None
        handle_len += len(packet)
        data += packet
    return data
 
 
def recv_msg(conn):
    struct_msg_len = recv_from(conn, 4)
    if not struct_msg_len:
        return None, 0
    msg_len = struct.unpack('>I', struct_msg_len)[0]
    msg = recv_from(conn, msg_len)
    msg = pickle.loads(msg)
    return msg, msg_len

客戶端

#!/usr/bin/python
# -*- coding: utf-8 -*-
 
import time
import select
import socket
import threading
from threading import Thread
from concurrent.futures import as_completed
from concurrent.futures import ThreadPoolExecutor
 
from common import send_msg, recv_msg
 
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # 生成socket
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)  # 不經(jīng)過WAIT_TIME,直接關(guān)閉
sock.setblocking(False)  # 設(shè)置非阻塞編程
 
inputs = [sock, ]
executor = ThreadPoolExecutor(max_workers=3)  # 設(shè)置線程池最大數(shù)量
 
print('client start!!!')
 
try:
    sock.connect(("127.0.0.1", 789))
except Exception as e:
    print(e)
 
 
def handle_received_data(data):
    print("接收服務(wù)端信息:", data)
    time.sleep(1)
    return
 
 
def receive_service_data():
    """接收服務(wù)端返回的數(shù)據(jù)并處理"""
    while True:
        try:
            r_list, w_list, e_list = select.select(inputs, [], [], 1)
            for event in r_list:
                data, data_len = recv_msg(event)
                if data:
                    try:
                        executor.submit(handle_received_data, data)
                    except Exception as e:
                        print(threading.current_thread(), threading.active_count())
                        print(e)
                else:
                    print("遠(yuǎn)程斷開連接")
                    inputs.remove(event)
                    exit()
        except OSError as e:
            import traceback
            print(traceback.format_exc())
            print(e)
            exit()
 
 
def send_client_data(size=100):
    """發(fā)送客戶端數(shù)據(jù)"""
    executors = []
    for i in range(size):
        exe = executor.submit(send_msg, sock, {'data': i})
        executors.append(exe)
    for feature in as_completed(executors):
        try:
            data, data_len = feature.result()
        except Exception as e:
            print(e)
        else:
            print(f"客戶端發(fā)送數(shù)據(jù):{data}, len:{data_len}")
 
 
if __name__ == '__main__':
    T1 = time.time()
 
    # 啟動接受服務(wù)端數(shù)據(jù)的線程
    Thread(target=receive_service_data).start()
 
    # 發(fā)送客戶端數(shù)據(jù)
    send_client_data(size=10)
    print('all_time:', time.time() - T1)

服務(wù)端

#!/usr/bin/python
# -*- coding: utf-8 -*-
import time
import socket
import select
import threading
from concurrent.futures import ThreadPoolExecutor
 
from common import send_msg, recv_msg
 
sock = socket.socket()
sock.bind(('127.0.0.1', 789))
sock.setblocking(False)
sock.listen()
 
inputs = [sock, ]
lock = threading.Lock()
executor = ThreadPoolExecutor(max_workers=3)  # 設(shè)置線程池最大數(shù)量
 
print('service start!!!')
 
 
def handle_received_data(event, data):
    time.sleep(1)
    send_msg(event, data)
    print(f"服務(wù)端發(fā)送數(shù)據(jù):{data}")
 
 
while True:
    r_list, w_list, e_list = select.select(inputs, [], [], 1)
    for event in r_list:
        if event == sock:
            print("新的客戶端連接")
            new_sock, addresses = event.accept()
            inputs.append(new_sock)
        else:
            data, msg_len = recv_msg(event)
            if data:
                print("接收到客戶端信息", data)
                executor.submit(handle_received_data, event, data)
            else:
                print("客戶端斷開連接")
                inputs.remove(event)

運行結(jié)果

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python字符串格式化方式

    Python字符串格式化方式

    這篇文章主要介紹了Python字符串格式化方式,字符串格式化在我們的開發(fā)過程中被廣泛的應(yīng)用,因此也是我們要重點掌握的內(nèi)容之一,下文相關(guān)介紹,需要的朋友可以參考一下
    2022-04-04
  • 使用Playwright和VSCode進(jìn)行自動化測試的實現(xiàn)

    使用Playwright和VSCode進(jìn)行自動化測試的實現(xiàn)

    本文將詳細(xì)介紹使用Playwright和VSCode進(jìn)行自動化測試,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2026-01-01
  • Numpy中arange()的用法及說明

    Numpy中arange()的用法及說明

    Numpy的arange()函數(shù)用于在指定間隔內(nèi)生成均勻間隔的數(shù)組,它接受開始值、停止值和步長來創(chuàng)建數(shù)組,返回的是ndarray類型,如果沒有提供dtype,則會根據(jù)其他參數(shù)推斷數(shù)據(jù)類型,對于浮點類型參數(shù),結(jié)果數(shù)組的長度計算方式為ceil((stop-start)/step)
    2024-10-10
  • Anaconda安裝以及修改環(huán)境默認(rèn)位置圖文教程

    Anaconda安裝以及修改環(huán)境默認(rèn)位置圖文教程

    Anaconda是一個用于科學(xué)計算的Python發(fā)行版,支持Linux,Mac, Windows, 包含了眾多流行的科學(xué)計算、數(shù)據(jù)分析的 Python 包,下面這篇文章主要給大家介紹了關(guān)于Anaconda安裝以及修改環(huán)境默認(rèn)位置的相關(guān)資料,需要的朋友可以參考下
    2023-04-04
  • Pytorch中關(guān)于model.eval()的作用及分析

    Pytorch中關(guān)于model.eval()的作用及分析

    這篇文章主要介紹了Pytorch中關(guān)于model.eval()的作用及分析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • python3使用logging包,如何把日志寫到系統(tǒng)的rsyslog中

    python3使用logging包,如何把日志寫到系統(tǒng)的rsyslog中

    這篇文章主要介紹了python3使用logging包,如何把日志寫到系統(tǒng)的rsyslog中的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Python自動化辦公之編寫PDF拆分工具

    Python自動化辦公之編寫PDF拆分工具

    這篇文章主要為大家分享一個Python自動化辦公的小工具——PDF拆分工具,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起動手試一試
    2022-03-03
  • Python 用Redis簡單實現(xiàn)分布式爬蟲的方法

    Python 用Redis簡單實現(xiàn)分布式爬蟲的方法

    本篇文章主要介紹了Python 用Redis簡單實現(xiàn)分布式爬蟲的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-11-11
  • flask框架使用orm連接數(shù)據(jù)庫的方法示例

    flask框架使用orm連接數(shù)據(jù)庫的方法示例

    這篇文章主要介紹了flask框架使用orm連接數(shù)據(jù)庫的方法,結(jié)合實例形式分析了flask框架使用flask_sqlalchemy包進(jìn)行mysql數(shù)據(jù)庫連接操作的具體步驟與相關(guān)實現(xiàn)技巧,需要的朋友可以參考下
    2018-07-07
  • Python 確定多項式擬合/回歸的階數(shù)實例

    Python 確定多項式擬合/回歸的階數(shù)實例

    今天小編就為大家分享一篇Python 確定多項式擬合/回歸的階數(shù)實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12

最新評論

乌拉特前旗| 岳阳市| 桃源县| 临沂市| 顺义区| 徐州市| 营口市| 灵武市| 阳朔县| 西乌| 宾川县| 丽水市| 丽水市| 潮州市| 桃源县| 双江| 房山区| 如皋市| 高雄县| 岳普湖县| 巨野县| 大渡口区| 长白| 商洛市| 大关县| 确山县| 合川市| 临海市| 樟树市| 远安县| 泉州市| 深州市| 股票| 德安县| 静海县| 彰武县| 噶尔县| 漳州市| 新建县| 土默特右旗| 抚松县|