零基础学AI人工智能:6.3 python进阶之网络编程和多线程
本文系统讲解了Python并发编程与网络通信的核心技术。首先区分了并发与并行的概念,详细介绍了多进程(适合CPU密集型任务)和多线程(适合IO密集型任务)的实现方式、核心特点及区别,重点分析了线程安全问题和互斥锁解决方案。在网络编程部分,阐述了socket编程的三要素(IP地址、端口号、协议),对比了TCP和UDP协议的特性,并列举了常见网络编程案例。这些技术为AI开发中的数据处理、模型训练和服务
上一篇我们学习了闭包、装饰器与深浅拷贝,掌握了 Python 函数增强与数据复制的高级技巧。在真实的 AI 开发场景中,我们经常需要处理大规模数据集、加速模型训练、实现分布式计算,或者搭建模型服务接口,这些都离不开多进程、多线程与网络编程的支持。
多进程与多线程是实现并发任务的核心手段,能够充分利用 CPU 资源,大幅提升程序运行效率;网络编程则是实现跨设备通信、分布式训练、模型服务部署的基础。今天我们就来系统学习这三大核心技术,帮大家掌握 Python 并发编程与网络通信的底层逻辑,为后续的 AI 项目实战打下坚实基础。
1. 并发与并行的核心基础
1.1 什么是并发与并行
无论是多进程还是多线程,本质上都是实现多任务的方式,而多任务的最终目标是充分利用 CPU 资源,提高程序的运行效率。并发与并行是多任务中两个最核心的概念,二者有着本质的区别:
- 并行:指多个 CPU 同时执行多个任务,前提是设备拥有多个 CPU 核心,每个核心独立执行一个任务,真正实现了任务的同时运行。
- 并发:指针对同一个 CPU,多个任务同时请求执行,但同一时间 CPU 只能执行一个任务,于是操作系统会安排它们交替执行。由于任务切换的时间非常短,我们看起来就像是任务在同时执行,本质上是 CPU 资源的分时复用。
1.2 进程的基本概念
进程是操作系统分配资源的最基本单位,我们可以把进程理解为一个可执行文件,比如电脑上的 exe 程序、dmg 程序,每一个运行中的程序都是一个独立的进程。每个进程都拥有自己独立的内存空间和系统资源,进程之间相互隔离,互不干扰。
2. 多进程:CPU 密集型任务的解决方案
2.1 多进程的核心概述
多进程是实现多任务的一种方式,它通过创建多个独立的进程来同时执行多个任务,每个进程都拥有自己独立的内存空间和 CPU 资源。多进程特别适合处理 CPU 密集型任务,比如大规模数据计算、模型训练、图像处理等,能够充分利用多核 CPU 的性能优势。
2.2 多进程的实现方式
实现多任务的多进程编程,主要分为三个核心步骤:
- 导入 Python 标准库中的多进程模块;
- 创建进程对象,关联需要执行的目标函数,同时可以为进程设置名称、传递参数;
- 调用启动方法,启动进程,进程开始执行目标函数中的逻辑。
2.3 多进程的核心细节
- 获取进程 ID:每个进程都有一个唯一的进程 ID(PID),用于标识进程。我们可以通过操作系统模块或者多进程模块提供的属性,获取当前进程的 ID,方便进程的管理和调试。
- 进程之间数据相互隔离:这是多进程最核心的特点之一。每个进程都拥有自己独立的内存空间,一个进程修改自己的数据,不会影响到其他进程的数据,这保证了进程之间的安全性,但也增加了进程间通信的复杂度。
- 主进程等待子进程结束:默认情况下,主进程会等待所有子进程执行完毕后,再结束自己的运行。如果需要提前结束主进程,可以通过守护进程或者手动关闭的方式实现。
3. 多线程:IO 密集型任务的解决方案
3.1 多线程的核心概述
多线程是实现多任务的另一种方式,它是进程内部的执行单元,一个进程至少包含一个主线程。多线程共享同一个进程的内存空间和系统资源,线程之间的切换开销远小于进程,特别适合处理 IO 密集型任务,比如文件读写、网络请求、数据加载等。
3.2 多线程的实现方式
多线程的实现方式与多进程非常相似,同样分为三个核心步骤:
- 导入 Python 标准库中的多线程模块;
- 创建线程对象,关联需要执行的目标函数;
- 调用启动方法,启动线程,线程开始执行目标函数中的逻辑。
3.3 多线程的核心细节
3.3.1 进程和线程的区别
进程和线程都是实现多任务的方式,但二者有着本质的区别,主要体现在以下四个方面:
- 资源分配:进程是 CPU 分配资源的最基本单位,线程是 CPU 调度资源的最基本单位;
- 依赖关系:线程依赖于进程而存在,不能独立存在,每个进程至少包含一个主线程;
- 数据隔离:进程之间数据相互隔离,同一个进程的多个线程之间数据共享;
- 资源消耗:进程相对更消耗系统资源,但是稳定性更强,一个进程崩溃不会影响其他进程;线程消耗资源更少,但稳定性较差,一个线程崩溃可能会导致整个进程崩溃。
3.3.2 多线程的数据共享与安全问题
同一个进程的多个线程之间共享内存空间,这使得线程之间的数据传递非常方便,但也带来了数据安全问题。当多个线程同时修改同一个共享数据时,可能会出现数据不一致的情况,也就是所谓的 “竞态条件”。
解决多线程数据安全问题的核心方案是使用互斥锁:
- 创建互斥锁对象;
- 在修改共享数据之前,调用加锁方法,获取锁的所有权;
- 修改完成后,调用释放方法,释放锁的所有权,让其他线程可以获取锁。
需要注意的是,如果释放锁的时机不对,可能会出现死锁的情况,导致程序卡死,因此在使用互斥锁时,一定要保证加锁和释放锁的操作成对出现。
4. 网络编程:跨设备通信的核心技术
4.1 网络编程的核心概述
网络编程就是用来实现网络互联的不同计算机上运行的程序之间进行数据交互的技术。网络编程也叫 socket 编程,套接字是网络通信的端点,通信的两端都有自己的套接字对象,数据在两个套接字之间通过数据包或者字节流的形式传输。
4.2 网络编程的三要素
要实现网络通信,必须满足三个核心要素,分别是 IP 地址、端口号和协议。
4.2.1 IP 地址
IP 地址是设备在网络中的唯一标识,用于在网络中定位设备。IP 地址主要分为两大类:
- 广域网 IP:用于在互联网中定位设备;
- 局域网 IP:用于在局域网中定位设备,常见的局域网 IP 段如 192.168.xx.xx。
- 常用的两个网络命令:
- 查看本机的 IP 地址配置;
- 测试本机与目标设备之间的网络连通性。
4.2.2 端口号
端口号是程序在设备上的唯一标识,用于在一台设备上定位具体的应用程序。端口号的范围是 0 到 65535,其中 0 到 1023 是系统保留端口,用于一些常用的网络服务,普通程序应该使用 1024 以上的端口号。
4.2.3 协议
协议是通信双方都要遵循的规则、规范和约定,只有遵循相同的协议,通信双方才能正确地进行数据交互。常用的网络传输协议有两种,分别是 TCP 协议和 UDP 协议。
4.2.4TCP 协议
- 面向有连接的协议,通信前需要先建立连接;
- 采用字节流传输数据,理论上数据大小没有限制;
- 区分客户端和服务器端;
- 传输效率相对较低,但数据传输安全可靠,不会丢失数据。
4.2.5 UDP 协议
- 面向无连接的协议,通信前不需要建立连接;
- 采用数据包传输数据,每个数据包的大小不超过 64KB;
- 不区分客户端和服务器端,既可以发送数据,也可以接收数据;
- 传输效率相对较高,但数据传输不安全,可能会丢失数据。
4.3 网络编程的常见案例
网络编程的应用非常广泛,常见的实战案例包括以下五个:
- socket 入门:掌握套接字的基本使用方法,创建客户端和服务器端的套接字对象;
- 客户端和服务器端收发一句话:实现最简单的客户端与服务器端之间的单向通信;
- 模拟多任务版的服务器端:实现服务器端同时处理多个客户端的请求;
- 客户端和服务器端上传文件:实现客户端向服务器端上传文件的功能;
- 模拟多任务版的服务器端接收多个文件:实现服务器端同时接收多个客户端上传的文件。
5. 逻辑图

更多推荐



所有评论(0)