详解python网络进程

yizhihongxing

详解 Python 网络进程

本文旨在介绍 Python 中常用的网络编程模式及其在进程(多进程、多线程)中的应用,以及一些实际场景中的应用示例。

网络编程模式

Python 中关于网络编程的模式较多,其中常用的有以下三种:

TCP 模式

TCP 是一种可靠的、面向连接的传输层协议。它保证数据的可靠性,因为数据会传输到指定的目的地,并且会被确认。TCP 适合用于对可靠传输要求较高的场景,如 HTTP 协议、SMTP 协议、FTP 协议等。

在 Python 中,使用 socket 模块实现 TCP 通信非常简单,示例代码如下:

import socket

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('localhost', 8000))
server_socket.listen(10)

while True:
    client_socket, client_address = server_socket.accept()
    print(f"Connection from {client_address[0]}:{client_address[1]}")
    data = client_socket.recv(1024)
    client_socket.sendall(data)
    client_socket.close()

这段代码创建了一个 TCP 服务器,绑定本地地址为 localhost:8000,并监听最多 10 个客户端的连接。然后服务器进入一个无限循环,接受客户端的连接,并回复客户端请求的数据,最后关闭连接,等待下一个客户端连接。

UDP 模式

UDP 是一种不可靠的、无连接的数据报传输协议。它不保证数据的可靠性,因为数据包会以固定大小的数据包形式发送给接收方。如果其中有数据包丢失,则无法获得原始的数据。UDP 适合用于对实时传输要求较高的场景,如 VoIP 协议、视频通话协议等。

在 Python 中,使用 socket 模块实现 UDP 通信与 TCP 类似,示例代码如下:

import socket

server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server_socket.bind(('localhost', 8000))

while True:
    data, address = server_socket.recvfrom(1024)
    print(f"Received data from {address[0]}:{address[1]}")
    server_socket.sendto(data, address)

这段代码创建了一个 UDP 服务器,绑定本地地址为 localhost:8000,然后服务器进入一个无限循环,接收客户端发送的数据,并将数据回复给客户端。

HTTP 模式

HTTP 是一种基于 TCP/UDP 的应用层协议,用于在 Web 浏览器和 Web 服务器之间传输数据。HTTP 协议是一种无状态、无连接、面向文本的协议,以请求(由客户端发起)和响应(由服务器发起)为基础。

在 Python 中,使用 http.server 模块实现简单的 HTTP 服务器非常方便:

import http.server
import socketserver

PORT = 8000

Handler = http.server.SimpleHTTPRequestHandler

with socketserver.TCPServer(("", PORT), Handler) as httpd:
    print("serving at port", PORT)
    httpd.serve_forever()

这段代码创建了一个简单的 HTTP 服务器,监听本地的 8000 端口,并等待客户端发起请求。当客户端发来请求时,服务器会返回相应的文件或目录信息。

进程通信

在多进程的环境中,进程间的通信是非常重要的。Python 提供了多种进程间通信的方式,例如:

管道(Pipe)

管道是一种进程间通信的机制,它基于操作系统提供的 FIFO(先进先出)缓冲区。管道可以使用 multiprocessing.Pipe() 函数创建,示例代码如下:

import multiprocessing

def send_message(conn):
    conn.send("Hello")
    conn.close()

if __name__ == '__main__':
    parent_conn, child_conn = multiprocessing.Pipe()
    p = multiprocessing.Process(target=send_message, args=(child_conn,))
    p.start()
    print(parent_conn.recv())
    p.join()

这段代码创建了一个进程间的通信管道,然后创建一个子进程,将消息 Hello 发送给父进程,最后在父进程中接收并打印消息。这里的 multiprocessing.Pipe() 函数会返回两个连接对象,一个是发送端连接对象,一个是接收端连接对象,所以需要在父子进程中分别使用不同的连接对象。

队列(Queue)

队列(Queue)是一种进程间通信的机制,它基于操作系统提供的 FIFO(先进先出)缓冲区。队列可以使用 multiprocessing.Queue()queue.Queue() 函数创建,示例代码如下:

import multiprocessing

def send_message(queue):
    queue.put("Hello")

if __name__ == '__main__':
    queue = multiprocessing.Queue()
    p = multiprocessing.Process(target=send_message, args=(queue,))
    p.start()
    print(queue.get())
    p.join()

这段代码创建了一个进程间通信的队列,然后创建一个子进程,将消息 Hello 放入队列中,最后在父进程中从队列中取出消息并打印。

共享内存(Shared Memory)

共享内存是一种进程间通信的机制,它可以将内存区域映射到多个进程的虚拟地址空间中,从而实现多个进程对同一片物理内存区域的共享。共享内存在数据量大、读写频繁的场景下具有很高的效率。

Python 内置的 multiprocessing 模块提供了对共享内存的支持,可以使用 multiprocessing.Value()multiprocessing.Array() 函数创建共享内存对象,示例代码如下:

import multiprocessing

def increment(n):
    n.value += 1

if __name__ == '__main__':
    num = multiprocessing.Value('i', 0)
    p = multiprocessing.Process(target=increment, args=(num,))
    p.start()
    p.join()
    print(num.value)

这段代码创建了一个整型共享内存对象 num,然后创建一个子进程,将 num 对象的值加一,最后在父进程中打印 num 值。这里的 'i' 参数表示共享内存的数据类型为整型。

示例

下面通过两个例子来说明 Python 网络编程在进程通信方面的应用:

多进程 HTTP 文件服务器

本示例将通过一个多进程实现的 HTTP 文件服务器来演示 TCP、进程通信等技术在实际场景中的应用。

import http.server
import socketserver
import multiprocessing


class FileHTTPServer:

    def __init__(self, port=8000):
        self.port = port
        self.address = ('localhost', port)

    def start(self):
        handler = http.server.SimpleHTTPRequestHandler
        self.server = socketserver.TCPServer(self.address, handler)
        self.server.serve_forever()

    def stop(self):
        self.server.shutdown()
        self.server.server_close()


class MultiProcessFileHTTPServer:

    def __init__(self, port=8000, process_num=4):
        self.process_num = process_num
        self.http_server = FileHTTPServer(port=port)

    def start(self):
        self.processes = []
        for i in range(self.process_num):
            p = multiprocessing.Process(target=self.http_server.start)
            p.daemon = True
            p.start()
            self.processes.append(p)

    def stop(self):
        for p in self.processes:
            p.terminate()
        self.http_server.stop()


if __name__ == '__main__':
    server = MultiProcessFileHTTPServer(port=8000, process_num=4)
    server.start()

这段代码实现了一个多进程的 HTTP 文件服务器:它由一个主进程和多个子进程构成,每个子进程都运行一个 HTTP 文件服务器。当客户端发送请求时,主进程会从子进程的服务器中选择一个最空闲的进程来处理。

多进程 TCP 服务器

本示例将通过一个多进程实现的 TCP 服务器来演示 TCP、进程通信等技术在实际场景中的应用。

import socket
import multiprocessing


def handle_client(conn, address):
    print(f"Connection from {address[0]}:{address[1]}")
    while True:
        data = conn.recv(1024)
        if not data:
            break
        conn.sendall(data)
    conn.close()


class MultiProcessTCPServer:

    def __init__(self, host='localhost', port=8000, process_num=4):
        self.host = host
        self.port = port
        self.process_num = process_num

    def start(self):
        self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.server_socket.bind((self.host, self.port))
        self.server_socket.listen(10)
        self.processes = []
        for i in range(self.process_num):
            p = multiprocessing.Process(target=self.handle_request)
            p.daemon = True
            p.start()
            self.processes.append(p)

    def handle_request(self):
        while True:
            client_socket, client_address = self.server_socket.accept()
            handle_client(client_socket, client_address)

    def stop(self):
        for p in self.processes:
            p.terminate()
        self.server_socket.close()


if __name__ == '__main__':
    server = MultiProcessTCPServer(process_num=4)
    server.start()

这段代码实现了一个多进程的 TCP 服务器:它由一个主进程和多个子进程构成,每个子进程都运行一个 TCP 服务器。当客户端发起连接请求时,主进程会从子进程的服务器中选择一个最空闲的进程来处理。当客户端发送数据时,子进程会接收并处理数据,并将处理结果发送回客户端。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解python网络进程 - Python技术站

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

相关文章

  • Python实现Tab自动补全和历史命令管理的方法

    演示代码可以在这里找到:https://github.com/neal1991/articles/blob/master/python-tab-auto-completion/autocompletion.py,接下来的讲解将以这份代码为例子。 什么是Tab自动补全和历史命令管理 在命令行中,我们经常需要输入很长的命令,会出现拼写错误、错误的命令、或者常见的…

    python 2023年5月19日
    00
  • Python实现读取并写入Excel文件过程解析

    在Python中,可以使用第三方库openpyxl来读取和写入Excel文件。以下是读取并写入Excel文件的详细攻略: 安装依赖库 要读取和写入Excel文件,需要安装openpyxl库。可以使用以下命令安装: pip install openpyxl 读取Excel文件 要读取Excel文件,可以使用openpyxl库的load_workbook()函数…

    python 2023年5月14日
    00
  • Python时间整数问题

    【问题标题】:Python time integer issuePython时间整数问题 【发布时间】:2023-04-04 03:14:01 【问题描述】: 我正在尝试计算“当时”和“现在”之间的时间差。我改变了格式,以便更好地比较它(我不需要秒或纳秒等) ‘then’ 时间来自加密,并且正在被解析以进行比较,这就是我担心的错误。 def decrypt_…

    Python开发 2023年4月6日
    00
  • Python3爬虫中Selenium的用法详解

    Python3爬虫中Selenium的用法详解 Selenium是一个自动化测试工具,可以模拟用户在浏览器中的操作,如点击、输入、滚动等。在Python3爬虫中,Selenium可以用于模拟浏览器行为,实现动态网页的爬取。本文将为您详细讲解Python3爬虫中Selenium的用法,包括Selenium的安装、使用方法、常用API等。过程中提供两个示例说明。…

    python 2023年5月14日
    00
  • Python闭包思想与用法浅析

    Python闭包思想与用法浅析 什么是闭包 闭包(closure)是函数式编程的重要的语法结构,是一种特殊的内嵌函数。闭包定义在外层函数中,而且可以引用外层函数的局部变量,将外层函数与内层函数连接起来形成一种闭合的状态。 在Python中,只要在一个函数中,定义了另外一个函数,且内部函数使用了外部函数的变量,那么这个外部函数,就称为闭包。 闭包的优点 闭包的…

    python 2023年6月5日
    00
  • Python 对象作为课堂讲师的可选参数

    【问题标题】:Python object as an optional argument of a class instructorPython 对象作为课堂讲师的可选参数 【发布时间】:2023-04-02 06:36:01 【问题描述】: 当创建一个类的新实例(比如 A)时,我希望另一个类的实例(比如 B)成为构造函数的可选参数。如果 B 作为参数给出,…

    Python开发 2023年4月8日
    00
  • python3连接mysql获取ansible动态inventory脚本

    这里提供一份完整的攻略,帮助大家快速掌握使用Python3连接MySQL数据库获取Ansible动态Inventory脚本的方法。 准备环境 在开始使用Python3连接MySQL数据库获取Ansible动态Inventory脚本之前,你需要先准备好以下环境: Python3环境,安装方法见官方文档 MySQL数据库,安装方法见官方文档 MySQL Pyth…

    python 2023年6月2日
    00
  • Python dataframe如何设置index

    设置DataFrame的索引可以让我们更方便地对数据进行切片操作和快速查找。在Python中,Pandas库提供了多种方法来设置DataFrame的索引。下面我将详细讲解Python DataFrame如何设置Index,包括以下内容: 1.使用DataFrame中的一列作为索引2.使用set_index函数设置索引3.使用reindex函数更新索引4.使用…

    python 2023年6月3日
    00
合作推广
合作推广
分享本页
返回顶部