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

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

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

背景

實(shí)現(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)過(guò)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()
 
    # 啟動(dòng)接受服務(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)

運(yùn)行結(jié)果

總結(jié)

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

相關(guān)文章

  • Python字符串格式化方式

    Python字符串格式化方式

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

    使用Playwright和VSCode進(jìn)行自動(dòng)化測(cè)試的實(shí)現(xiàn)

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

    Numpy中arange()的用法及說(shuō)明

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

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

    Anaconda是一個(gè)用于科學(xué)計(jì)算的Python發(fā)行版,支持Linux,Mac, Windows, 包含了眾多流行的科學(xué)計(jì)算、數(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()的作用及分析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • python3使用logging包,如何把日志寫到系統(tǒng)的rsyslog中

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

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

    Python自動(dòng)化辦公之編寫PDF拆分工具

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

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

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

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

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

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

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

最新評(píng)論

屯门区| 澄江县| 航空| 株洲县| 云浮市| 安图县| 噶尔县| 蓬溪县| 和平区| 饶河县| 和静县| 本溪| 忻州市| 西和县| 宣汉县| 武鸣县| 武夷山市| 永泰县| 信丰县| 隆尧县| 鄱阳县| 游戏| 烟台市| 铅山县| 淮南市| 高邑县| 鄂州市| 英超| 萨迦县| 周宁县| 安达市| 永清县| 南京市| 师宗县| 建阳市| 共和县| 布尔津县| 鄄城县| 洞头县| 苍山县| 泰州市|