python 实现socket服务端并发的四种方式

欢迎阅读本文,本文将全面讲解 Python 实现 socket 服务端并发的四种方式,包括:

1.多线程方式

2.多进程方式

3.select 方式

4.EPOLL方式

多线程方式

  1. 基于 socket 创建服务端套接字,使用 bind() 方法让服务端套接字与固定 IP 和端口绑定,使用 listen() 方法开始监听客户端连接;

  2. 在监听客户端连接之后,使用 accept() 方法接收客户端连接,每接收一个连接就创建一个新线程,用于与客户端通信;

  3. 同时创建的线程数量最好不要过多,过多的线程会导致资源浪费,也会影响程序效率。

以下是示例代码:

import socket
import threading

def client_handler(client_socket, addr):
    print('New connection from', addr)
    while True:
        try:
            data = client_socket.recv(1024)
            if not data:
                break
            client_socket.sendall(data) # 自动回传消息
        except:
            break
    client_socket.close()

def main():
    host = '127.0.0.1'
    port = 5000
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_socket.bind((host,port))
    server_socket.listen(5)

    while True:
        client_socket, addr = server_socket.accept()
        t = threading.Thread(target=client_handler, args=(client_socket, addr))
        t.start()

if __name__ == '__main__':
    main()

多进程方式

  1. 基于 socket 创建服务端套接字,使用 bind() 方法让服务端套接字与固定 IP 和端口绑定,使用 listen() 方法开始监听客户端连接;

  2. 在监听客户端连接之后,使用 accept() 方法接收客户端连接,每接收一个连接就创建一个新进程,用于与客户端通信;

  3. 同时创建的进程数量最好不要过多,过多的进程会导致资源浪费,也会影响程序效率。

以下是示例代码:

import socket
import multiprocessing

def client_handler(client_socket, addr):
    print('New connection from', addr)
    while True:
        try:
            data = client_socket.recv(1024)
            if not data:
                break
            client_socket.sendall(data) # 自动回传消息
        except:
            break
    client_socket.close()

def main():
    host = '127.0.0.1'
    port = 5000
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_socket.bind((host,port))
    server_socket.listen(5)

    while True:
        client_socket, addr = server_socket.accept()
        p = multiprocessing.Process(target=client_handler, args=(client_socket, addr))
        p.start()

if __name__ == '__main__':
    main()

Select方式

1.基于 socket 创建服务端套接字,使用 bind() 方法让服务端套接字与固定 IP 和端口绑定,使用 listen() 方法开始监听客户端连接;

2.在监听客户端连接之后,通过 select 方法来选择读取,每当有新的客户端连接时,通过 accept() 方法来接收客户端连接。

以下是示例代码:

import socket
import select

def main():
    host = '127.0.0.1'
    port = 5000
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_socket.bind((host,port))
    server_socket.listen(5)

    read_list = [server_socket]
    while True:
        readable, writable, _ = select.select(read_list, [], [])
        for s in readable:
            if s is server_socket:
                client_socket, addr = server_socket.accept()
                read_list.append(client_socket)
                print('New connection from', addr)
            else:
                data = s.recv(1024)
                if not data:
                    read_list.remove(s)
                    s.close()
                    continue
                s.sendall(data) # 自动回传消息

if __name__ == '__main__':
    main()

EPOLL方式

  1. 基于 socket 创建服务端套接字,使用 bind() 方法让服务端套接字与固定 IP 和端口绑定,使用 listen() 方法开始监听客户端连接;

  2. 在监听客户端连接之后,通过 epoll 方法来选择读取,每当有新的客户端连接时,通过 accept() 方法来接收客户端连接。

以下是示例代码:

import socket
import select

def main():
    host = '127.0.0.1'
    port = 5000
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_socket.bind((host,port))
    server_socket.listen(5)

    epoll = select.epoll()
    epoll.register(server_socket.fileno(), select.EPOLLIN)
    connections = {}
    while True:
        events = epoll.poll(1)
        for fileno, event in events:
            if fileno == server_socket.fileno():
                # 接受客户端连接
                client_socket, client_address = server_socket.accept()
                print('New connection from', client_address)
                connections[client_socket.fileno()] = client_socket
                epoll.register(client_socket.fileno(), select.EPOLLIN)
            elif event & select.EPOLLIN:
                # 接收客户端数据
                client_socket = connections[fileno]
                data = client_socket.recv(1024)
                if data:
                    client_socket.sendall(data) # 自动回传消息
                else:
                    epoll.unregister(fileno)
                    client_socket.close()
                    del connections[fileno]

    epoll.unregister(server_socket.fileno())
    epoll.close()
    server_socket.close()

if __name__ == '__main__':
    main()

总结:

本文介绍了四种 Python 实现 socket 服务端并发的方式,分别是多线程方式、多进程方式、select 方式、EPOLL方式。不同的方式有不同的应用场景,开发者们可以根据需要进行选择,提高程序运行效率。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python 实现socket服务端并发的四种方式 - Python技术站

(0)
上一篇 2023年5月16日
下一篇 2023年5月16日

相关文章

  • 简单谈谈Java 中的线程的几种状态

    当Java程序启动时,JVM会为主线程分配一个特殊的栈来执行代码。同时,程序可以创建若干个子线程以支持并发执行相应的任务。线程在执行过程中,可以出现以下几种状态: 新建状态(New) 当线程对象创建以后,该线程处于新建状态。此时线程对象已经在内存中了,但是还没有分配系统资源,没有被CPU选中去执行,也没有开始执行线程中的代码。因此,新建状态的线程在内存中的状…

    多线程 2023年5月16日
    00
  • Go并发控制WaitGroup的使用场景分析

    Go并发控制WaitGroup的使用场景分析 Go语言的并发模型是通过goroutine和channel实现的。goroutine是轻量级线程,可以在同一进程的多个线程之间切换执行。channel提供了goroutine之间的通信和同步机制。在使用goroutine时,我们很常用到sync.WaitGroup来控制并发。本文将详细讲解WaitGroup的使用…

    多线程 2023年5月16日
    00
  • 分析详解python多线程与多进程区别

    分析详解Python多线程与多进程区别 在Python中多线程和多进程是用来实现并发编程的两种不同的机制。在开始学习这两种技术之前,我们必须了解它们的异同之处,以便我们能够采用最合适的技术来解决具体问题。 什么是多线程? 多线程是将一个进程内部的任务分为不同的线程来进行同时执行的机制。每个线程都有自己的代码,自己的栈以及自己的寄存器,但是它们之间共享进程的内…

    多线程 2023年5月16日
    00
  • java基本教程之java线程等待与java唤醒线程 java多线程教程

    Java线程等待与唤醒线程 线程等待 线程等待就是让线程先暂停一下,等待特定的条件被满足时再继续执行,一般情况下会使用wait()方法进行线程等待。 wait()方法的用法: synchronized(monitorObject) { while(!conditionWarranted()) { monitorObject.wait(); } 代码中的mon…

    多线程 2023年5月16日
    00
  • 详解JUC并发编程之锁

    详解JUC并发编程之锁 什么是锁 锁是Java并发编程中用于控制多个线程访问共享资源的机制。在多线程环境下,由于线程运行的不确定性,多个线程可能会同时访问同一个共享资源,导致数据不一致、程序崩溃等问题。锁机制可以保证同一时刻只有一个线程能够访问共享资源,从而达到并发安全的目的。 Java中的锁分类 Java中的锁主要分为两类:内部锁(synchronized…

    多线程 2023年5月17日
    00
  • python并发编程之线程实例解析

    Python并发编程之线程实例解析 什么是线程? 线程是操作系统能够进行调度的最小单位。它被包含在进程中,是进程中的实际运行单位。每个进程至少有一个线程。使用线程,进程可以在同一时间执行多个不同的任务。 Python中的线程 Python提供了threading模块来实现多线程编程。该模块提供了Thread类,可用于创建新的线程,也提供了许多便利的函数和方法…

    多线程 2023年5月17日
    00
  • python实现多线程的两种方式

    让我来详细讲解一下Python实现多线程的两种方式。 1. 使用threading模块实现多线程 Python提供了一个内置模块threading来实现多线程。使用threading模块实现多线程的基本步骤如下: 1.导入threading模块: import threading 2.创建一个继承自threading.Thread类的子类,重写其run方法:…

    多线程 2023年5月17日
    00
  • java利用Future实现多线程执行与结果聚合实例代码

    下面我为你详细解析如何利用Java的Future实现多线程执行以及结果聚合的实例代码。 一、Future的概述 Java中的Future表示一个异步计算任务,是构建异步应用程序的基础。它提供了在处理多线程计算结果时的Java编程接口,可以用于指示多线程计算是否完成,获取计算的结果,并且可以取消计算。 二、FutureTask的使用 在Java中,Future…

    多线程 2023年5月16日
    00
合作推广
合作推广
分享本页
返回顶部