python 简单搭建阻塞式单进程,多进程,多线程服务的实例

2023-12-16Python编程
11

当我们需要开发一个服务时,我们可能需要采用不同的方式来完成这个服务,比如运行一个阻塞式单进程、多进程或者多线程服务。在Python中,我们可以使用不同的库来完成这些任务。

以下是Python搭建阻塞式单进程、多进程和多线程服务的完整攻略。

阻塞式单进程服务

阻塞式单进程服务是指只有一个进程在处理请求,而所有的请求都是按顺序依次处理的。一旦开始处理一个请求,进程就会被阻塞住直到请求处理完毕。

下面是一个使用Python标准库搭建阻塞式单进程服务的示例:

import socket

HOST = '127.0.0.1'  # Standard loopback interface address (localhost)
PORT = 65432        # Port to listen on (non-privileged ports are > 1023)

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind((HOST, PORT))
    s.listen()
    conn, addr = s.accept()
    with conn:
        print('Connected by', addr)
        while True:
            data = conn.recv(1024)
            if not data:
                break
            conn.sendall(data)

这个示例代码使用了socket模块来创建一个TCP服务器,然后在一个无限循环中等待客户端连接,当有客户端连接时,将数据收到缓冲区,当收到的数据为空时,则停止收取数据,进入发送阶段,将缓冲区的数据全部发送回客户端。

多进程服务

多进程服务是指使用多个进程来处理请求。这种服务可以提高并发性能,因为多个进程可以同时处理多个请求。

下面是一个使用Python标准库搭建多进程服务的示例:

import socket
import os

def handle_request(conn, addr):
    with conn:
        print('Connected by', addr)
        while True:
            data = conn.recv(1024)
            if not data:
                break
            conn.sendall(data)

def main():
    HOST = '0.0.0.0' # Bind to all interfaces
    PORT = 65432     # Port to listen on (non-privileged ports are > 1023)

    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        s.bind((HOST, PORT))
        s.listen()

        while True:
            conn, addr = s.accept()

            pid = os.fork()

            if pid == 0:
                # Child process
                s.close()
                handle_request(conn, addr)
                conn.close()
                os._exit(0)
            else:
                # Parent process
                conn.close()

if __name__ == '__main__':
    main()

这个示例代码使用了socket模块来创建一个TCP服务器,然后在一个无限循环中等待客户端连接。当有客户端连接时,创建一个子进程来处理连接。父进程则关闭连接,继续等待下一个连接。

多线程服务

多线程服务是指使用多个线程来处理请求。这种服务可以提高并发性能,因为多个线程可以同时处理多个请求。

下面是一个使用Python标准库搭建多线程服务的示例:

import socket
import threading

def handle_request(conn, addr):
    with conn:
        print('Connected by', addr)
        while True:
            data = conn.recv(1024)
            if not data:
                break
            conn.sendall(data)

def main():
    HOST = '127.0.0.1' # Standard loopback interface address (localhost)
    PORT = 65432       # Port to listen on (non-privileged ports are > 1023)

    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        s.bind((HOST, PORT))
        s.listen()

        while True:
            conn, addr = s.accept()

            t = threading.Thread(target=handle_request, args=(conn, addr))
            t.start()

if __name__ == '__main__':
    main()

这个示例代码使用了socket模块来创建一个TCP服务器,然后在一个无限循环中等待客户端连接。当有客户端连接时,创建一个新线程来处理连接。

以上是三种不同方式搭建Python服务的示例,可以根据实际场景选择最适合的方式来处理。

The End

相关推荐

解析Python中的eval()、exec()及其相关函数
Python中有三个内置函数eval()、exec()和compile()来执行动态代码。这些函数能够从字符串参数中读取Python代码并在运行时执行该代码。但是,使用这些函数时必须小心,因为它们的不当使用可能会导致安全漏洞。...
2023-12-18 Python编程
117

Python下载网络文本数据到本地内存的四种实现方法示例
在Python中,下载网络文本数据到本地内存是常见的操作之一。本文将介绍四种常见的下载网络文本数据到本地内存的实现方法,并提供示例说明。...
2023-12-18 Python编程
101

Python 二进制字节流数据的读取操作(bytes与bitstring)
来给你详细讲解下Python 二进制字节流数据的读取操作(bytes与bitstring)。...
2023-12-18 Python编程
120

Python3.0与2.X版本的区别实例分析
Python 3.x 是 Python 2.x 的下一个重大版本,其中有一些值得注意的区别。 Python 3.0中包含了许多不兼容的变化,这意味着在迁移到3.0之前,必须进行代码更改和测试。本文将介绍主要的差异,并给出一些实例来说明不同点。...
2023-12-18 Python编程
34

python如何在终端里面显示一张图片
要在终端里显示图片,需要使用一些Python库。其中一种流行的库是Pillow,它有一个子库PIL.Image可以加载和处理图像文件。要在终端中显示图像,可以使用如下的步骤:...
2023-12-18 Python编程
91

Python图像处理实现两幅图像合成一幅图像的方法【测试可用】
在Python中,我们可以使用Pillow库来进行图像处理。具体实现两幅图像合成一幅图像的方法如下:...
2023-12-18 Python编程
103