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多线程累加计数的实现方法提供一些攻略。 方案一:使用synchronized同步方法 synchronized同步方法是保证线程安全的常用手段之一,在多线程环境下可以确保只有一个线程在执行某个同步方法时获得对象锁,其他线程处于等待状态。 要实现多线程累加计数,可以使用synchro…

    多线程 2023年5月17日
    00
  • java高并发InterruptedException异常引发思考

    下面就是详细讲解“java高并发InterruptedException异常引发思考”的完整攻略。 什么是InterruptedException? 在Java编程中,InterruptedException通常是由于线程等待和执行过程中出现中断时触发的异常。Interrupted异常是一个受检查的异常,在代码中必须进行catch处理或者往上抛出。当一个线程…

    多线程 2023年5月17日
    00
  • Java多线程 两阶段终止模式Two-Phase Termination Patter

    Java多线程 两阶段终止模式Two-Phase Termination Pattern 简介 在多线程编程中,线程的终止是一个比较复杂的问题。一般来说,线程有两种终止方式,一种是自然终止,另一种是强制终止。自然终止是指线程执行完了所有任务后正常结束,强制终止则是在任务还没有完成时,直接终止线程。强制终止可能会导致线程内部还未处理完的数据出现异常,使得线程内…

    多线程 2023年5月16日
    00
  • 深入多线程之:Wait与Pulse的使用详解

    深入多线程之:Wait与Pulse的使用详解 概述 在多线程编程中,Wait和Pulse两个方法可用于线程间的通信。Wait方法会暂停调用线程的执行,直到另一个线程发出信号并重新唤醒等待线程。而Pulse方法用于唤醒一个等待的线程。 Wait方法 Wait方法提供了一种将线程从忙碌状态切换到等待状态的方法,并在发出信号时将线程重新唤醒。它的语法如下所示: M…

    多线程 2023年5月17日
    00
  • C#如何对多线程、多任务管理(demo)

    我们来详细讲解C#如何对多线程、多任务进行管理的攻略。 C#多线程管理 在C#中,可以使用System.Threading命名空间中的类来实现对多线程的管理。其中比较常用到的类有Thread、ThreadPool和Task等。 Thread类 Thread类是用于创建新的线程的主要类之一。我们可以使用Thread类的静态方法来创建线程。其中,最常用的方法是T…

    多线程 2023年5月16日
    00
  • Python 微信爬虫完整实例【单线程与多线程】

    Python 微信爬虫完整实例【单线程与多线程】攻略 本文介绍了如何用Python实现微信公众号文章的爬取,并提供了单线程与多线程两种实现方式,以便读者可以根据自己的需求选择适用的方法。 准备工作 在开始爬虫之前,需准备如下软件工具: Python 3.x Chrome浏览器 Chromedriver requests bs4 lxml selenium 单…

    多线程 2023年5月16日
    00
  • Python中的并发处理之asyncio包使用的详解

    Python中的并发处理之asyncio包使用的详解 什么是asyncio asyncio是Python3.4版本引入的一种标准库,用于支持异步IO编程。asyncio实现了TCP、UDP、SSL等协议,可以方便地实现异步I/O操作,适用于高并发IO密集型应用程序。 asyncio使用协程技术实现异步编程,相比于多线程、线程池等方式,它具有协程的优点,可以避…

    多线程 2023年5月16日
    00
  • .NET并发编程之函数闭包

    .NET并发编程是一个非常广泛的话题,其中函数闭包是一个非常重要的部分。在本篇攻略中,我将详细讲解什么是函数闭包,它的用途以及如何在.NET环境中使用它来实现并发编程。 什么是函数闭包 先从概念上来讲,函数闭包是一种特殊的函数,它可以访问其外部环境中的变量和函数,即使这些变量和函数已经不再存在,也可以继续使用。它通常用来创建函数工厂,或者是实现某些高级编程模…

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