详解python网络进程

详解 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求解平方根的方法

    Python 求解平方根的方法,主要可以分为以下两种: 1. 使用 math 模块 Python 内置的 math 库提供了 sqrt(x) 方法用于求平方根,该方法的使用方法如下: import math # 求平方根 math.sqrt(4) # 返回 2.0 代码说明: 导入 math 库; 使用 sqrt 方法,传入要求平方根的数字。 2. 使用幂运…

    python 2023年6月5日
    00
  • Python使用爬虫爬取贵阳房价的方法详解

    本攻略将提供一个Python使用爬虫爬取贵阳房价的方法详解,包括爬虫的概念、爬虫的基本流程、爬取贵阳房价的方法。攻略将包含两个示例,分别演示如何使用Python爬取贵阳房价。 爬虫的概念 爬虫是一种自动化程序,用于从互联网上获取数据。爬虫程序通常会模拟浏览器行为,访问网站并抓取网页内容。爬虫程序可以用于各种用途,例如搜索引擎、数据挖掘、信息收集等。 爬虫的基…

    python 2023年5月15日
    00
  • Python的安装步骤是什么?

    Sure,Python的安装步骤如下: 下载Python 首先,进入官网下载Python的最新版本。根据自己的需求选择相应的版本,例如:Windows或macOS等,也可以选择自己需要的具体版本,注意Python3和Python2的区别。 安装Python Windows 下载安装程序,建议下载exe安装程序; 运行安装程序,勾选“Add Python 3.…

    python 2023年4月19日
    00
  • Python 错误和异常代码详解

    下面为您详细讲解“Python 错误和异常代码详解”的攻略。 一、Python错误和异常介绍 在编写程序时,经常会遇到错误和异常。遇到错误时程序会停止执行,而异常则是一种可以被处理的错误。Python中内置了许多异常类型,同时我们也可以通过 raise 语句自定义异常。 1.1 异常类型 Python内置的异常类型有很多,比如: IOError(文件读写错误…

    python 2023年5月13日
    00
  • 详解Python time库的使用

    详解Python time库的使用 time库是Python内置的库,用于处理时间和日期相关的函数和方法。在本篇攻略中,我们将详细讲解time库的使用,包括时间的格式化、时间戳等相关操作。 时间的表示方式 在Python中,时间有两种常见的表示方式: 时间元组(struct_time),包含年、月、日、时、分、秒等时间信息 时间戳(timestamp),表示…

    python 2023年6月2日
    00
  • python字典的遍历3种方法详解

    当我们使用Python编程时,经常会涉及到遍历一个字典的所有键值对。Python提供了多种遍历字典的方法,接下来将介绍三种最常用的遍历字典的方法。 方法一:使用items()方法遍历字典 Python中的字典有一个方法,叫做items()。items()方法返回一个包含(key, value)元组的列表。我们可以对这个列表进行遍历,从而遍历字典中的键值对。 …

    python 2023年5月13日
    00
  • Python制作豆瓣图片的爬虫

    下面是详细的攻略: Python制作豆瓣图片的爬虫 在Python中,我们可以使用requests和BeautifulSoup模块实现豆瓣图片的爬虫。本文将手把手教你用Python制作豆瓣图片的爬虫,并提供两个示例说明。 实现过程 在实现豆瓣图片的爬虫的过程中,我们需要模拟浏览器发送请求,并解返回的HTML页面。下面是一个简单的示例代码: import re…

    python 2023年5月14日
    00
  • Python图片检索之以图搜图

    下面我会详细讲解“Python图片检索之以图搜图”的完整攻略,包括环境配置、技术原理、代码实现等内容,其中包含两条示例说明。 环境配置 此项技术原理依赖于深度学习,所以需要安装相应的python库和模型。具体步骤如下: 安装tensorflow、keras以及opencv-python库。可以使用pip指令直接在命令行中安装,如下: pip install …

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