Python多进程与服务器并发原理及用法实例分析

Python多进程与服务器并发原理及用法实例分析

1. 概述

本文将介绍Python多进程和服务器并发编程相关的知识,包括以下几个方面:

  1. 什么是进程和并发编程
  2. Python多进程模块multiprocessing的基本使用方法
  3. Python服务器并发编程的基本原理
  4. Python服务器并发编程的实例分析

2. 进程和并发编程

进程是计算机中运行程序的基本单位,每个进程都有它自己的地址空间、数据栈,以及其他必须的资源。一个进程可以有多个线程,每个线程运行在同一个进程的上下文中,并共享同样的资源。并发编程是指为了提高程序执行效率和性能,在计算机中同时执行多个任务的编程技术。

3. Python多进程模块multiprocessing的基本使用方法

multiprocessing是Python中用于支持多进程编程的模块。通过将任务放在多个进程中运行,能够充分利用多核CPU的优势,从而提高程序的性能。

以下是multiprocessing的基本使用方法:

  1. 导入multiprocessing模块:import multiprocessing
  2. 创建进程:p = multiprocessing.Process(target=函数名, args=函数参数)
  3. 启动进程:p.start()
  4. 等待进程结束:p.join()

示例1:实现两个进程的简单通信

import multiprocessing

def worker1(queue):
    queue.put('Hello')

def worker2(queue):
    msg = queue.get()
    print(msg + ' World')

if __name__ == '__main__':
    queue = multiprocessing.Queue()
    p1 = multiprocessing.Process(target=worker1, args=(queue,))
    p2 = multiprocessing.Process(target=worker2, args=(queue,))
    p1.start()
    p2.start()
    p1.join()
    p2.join()

示例2:实现多进程下载文件

import multiprocessing
import requests

def download(file_url, file_name):
    r = requests.get(file_url, stream=True)
    with open(file_name, 'wb') as f:
        for chunk in r.iter_content(1024):
            if chunk:
                f.write(chunk)

if __name__ == '__main__':
    urls = [
        'https://www.example.com/file1',
        'https://www.example.com/file2',
        'https://www.example.com/file3'
    ]
    names = [
        'file1',
        'file2',
        'file3'
    ]
    processes = []
    for i in range(len(urls)):
        p = multiprocessing.Process(target=download, args=(urls[i], names[i]))
        p.start()
        processes.append(p)
    for p in processes:
        p.join()

4. Python服务器并发编程的基本原理

在Python中,可以使用socket模块实现网络编程,其中包括使用TCP/IP协议建立网络连接。对于服务器并发编程,可以使用多线程或多进程的方式来实现。多线程的方式可以使用Python的_thread和threading模块,多进程的方式可以使用multiprocessing模块。

以下是Python服务器并发编程的基本原理:

  1. 创建套接字,绑定IP地址和端口号。
  2. 监听套接字,等待客户端连接请求。
  3. 接受客户端连接请求,创建连接套接字。
  4. 创建新线程或新进程,用于处理客户端请求。
  5. 关闭连接套接字。

5. Python服务器并发编程的实例分析

示例3:使用多进程方式实现多客户端简单聊天室

import socket
import multiprocessing

def handle_client(conn, addr):
    print('Client connected:', addr)
    message = 'Welcome to chat room'
    conn.send(message.encode())
    while True:
        data = conn.recv(1024)
        if not data:
            break
        message = data.decode()
        print('Received message from', addr, ':', message)
        response = 'Received message: ' + message
        conn.send(response.encode())
    print('Client disconnected:', addr)
    conn.close()

if __name__ == '__main__':
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_socket.bind(('127.0.0.1', 9999))
    server_socket.listen(5)
    print('Server started')
    while True:
        conn, addr = server_socket.accept()
        p = multiprocessing.Process(target=handle_client, args=(conn, addr))
        p.start()

在这个简单的聊天室中,当有客户端连接上服务器后,服务器会向客户端发送欢迎信息,并且能够接受客户端发送的数据,并将其加上前缀“Received message: ”返回给客户端。

示例4:使用多线程方式实现文件上传服务器

import socket
import threading

def handle_client(conn, addr):
    print('Client connected:', addr)
    while True:
        data = conn.recv(1024)
        if not data:
            break
        file_size = int.from_bytes(data[:4], byteorder='big')
        file_name = data[4:].decode()
        print('Uploading file:', file_name, 'of size:', file_size)
        total_bytes = 0
        with open(file_name, 'wb') as f:
            while total_bytes < file_size:
                data = conn.recv(1024)
                f.write(data)
                total_bytes += len(data)
        print('File upload completed')
    print('Client disconnected:', addr)
    conn.close()

if __name__ == '__main__':
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_socket.bind(('127.0.0.1', 9999))
    server_socket.listen(5)
    print('Server started')
    while True:
        conn, addr = server_socket.accept()
        t = threading.Thread(target=handle_client, args=(conn, addr))
        t.start()

在这个文件上传服务器中,当有客户端连接上服务器后,客户端会向服务器发送一个4字节的文件大小信息,接着再发送文件名及文件内容。服务器接受到文件后将其写入指定的文件名中。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python多进程与服务器并发原理及用法实例分析 - Python技术站

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

相关文章

  • Django笔记二十三之case、when操作条件表达式搜索、更新等操作

    本文首发于公众号:Hunter后端原文链接:Django笔记二十三之条件表达式搜索、更新等操作 这一篇笔记将介绍条件表达式,就是如何在 model 的使用中根据不同的条件筛选数据返回。 这个操作类似于数据库中 if elif else 的逻辑。 以下是本篇笔记的目录: model 和数据准备 When 和 Case 操作新增字段返回 条件搜索 条件更新 条件…

    python 2023年4月17日
    00
  • 详解python读取和输出到txt

    下面是详解Python读取和输出到txt的完整攻略。 一、Python读取txt文件 Python可以很方便地读取txt文本文件中的数据,其中最常用的方法是使用open函数,然后再使用read方法将数据读取到内存中。 1.读取整个文件 代码示例: with open(‘test.txt’, ‘r’) as f: data = f.read() print(d…

    python 2023年6月5日
    00
  • python hash每次调用结果不同的原因

    Python中的hash函数是一种用来生成数据摘要的技术。它将不同的输入数据映射成固定长度的输出消息,被用来验证数据的完整性和比较大量的数据。但是,有些情况下我们可能会发现同样的输入,调用hash函数的结果不同,这是因为hash结果的计算过程中受到多种因素的影响,本文将深入探究一下这些因素。 哈希碰撞 首先,我们需要知道哈希碰撞这个概念。哈希碰撞指的是不同的…

    python 2023年6月2日
    00
  • Python批量解压&压缩文件夹的示例代码

    下面是“Python批量解压&压缩文件夹的示例代码”的完整攻略: 一、批量解压 1.1 解压单个文件 解压单个文件非常简单,我们可以使用Python内置的zipfile模块来完成。示例代码如下: import zipfile zip_file_path = ‘example.zip’ output_folder = ‘output’ with zip…

    python 2023年6月3日
    00
  • Python入门教程(九)Python字符串介绍

    Python入门教程(九)Python字符串介绍 在Python中,字符串是一种不可变的数据类型,表示一系列Unicode字符序列。字符串在Python中非常重要,因为它们可以用于许多地方,比如文件处理。本文将介绍Python字符串的基本用法和操作。 字符串的定义 要定义一个字符串,请将文本包装在引号中。Python中支持单引号、双引号和三引号: # 使用单…

    python 2023年5月14日
    00
  • python脚本实现xls(xlsx)转成csv

    一、需求分析 将Excel文件转换为CSV格式是非常常见的需求。Python脚本实现Excel到CSV的转换可以方便地将Excel文件批量转换为CSV格式。Python中有许多库可以用来实现Excel到CSV格式转换,比如pandas和openpyxl。其中,pandas支持将多个Sheet页合并为一个CSV文件,而openpyxl则可以输出每个Sheet页…

    python 2023年6月3日
    00
  • Python利用imshow制作自定义渐变填充柱状图(colorbar)

    下面是详细的攻略步骤: 1. 准备工作 在开始制作渐变填充柱状图之前,我们需要准备一些工作。首先,我们需要安装Python的数据可视化库matplotlib。可以使用pip命令进行安装: pip install matplotlib 其次,我们需要构造用于绘制柱状图的数据。这里我用一个简单的列表来表示: data = [20, 50, 80, 70, 30,…

    python 2023年6月6日
    00
  • Python接口自动化之浅析requests模块post请求

    以下是关于Python用requests实现HTTP请求代码实例: Python用requests实现HTTP请求代码实例 在Python中,requests是一个流行的HTTP库,可以用于向Web发送HTTP请求和接响应。以下是Python用requests实现HTTP请求代码实例: 发送GET请求 使用requests库发送GET请求非常简单,以下是发送…

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