Python多线程、Socket网络编程与正则表达式实战指南

Theo
Theo
发布时间:2026-10-12| 2人浏览过
原创

本文系统讲解Python闭包变量隔离、多线程并发控制(含守护线程、Join阻塞与互斥锁)、Socket同步网络通信及re模块正则匹配语法。结合ATM账户模拟、多窗口售票防冲突、TCP客户端服务端交互及常见字符串校验示例,提供可运行的完整代码结构,帮助开发者快速掌握Python并发与文本处理核心技术。

闭包与非局部变量管理

在全局作用域中直接修改外部变量(如使用 global)容易引发任意访问与意外覆盖的风险。为了解决此类数据安全问题,Python 引入了闭包机制,通过嵌套函数与 nonlocal 关键字实现变量状态的私有化封装。

闭包的定义条件为:在函数嵌套的前提下,内部函数引用外部函数的变量,并且外部函数返回了该内部函数。此时被引用的外部变量不会随外部函数执行结束而被销毁。

def out(account):
    def atm(num, flag):
        nonlocal account  # 声明变量来自外层作用域且可被修改
        if flag:
            account += num
            print("余额", account)
        else:
            account -= num
            print("余额", account)
    return atm

atm_func = out(100)  # 初始化起始余额并获取内部函数
atm_func(200, True)  # 存入200元
atm_func(100, False) # 取出100元

通过上述结构,account 不再是全局变量,只能通过 atm_func 调用进行修改,有效隔离了外部干扰。

Python多线程基础与并发控制

现代操作系统支持多程序并行运行(进程),而一个进程内部可包含多个执行流(线程)。线程是 CPU 调度的基本单位。Python 通过内置的 threading 模块提供多线程能力,核心类为 threading.Thread。

第1步:创建并启动线程

入口位于 threading.Thread 构造函数,常用参数包括 target(任务函数)、args(位置参数元组)、kwargs(字典参数)。调用 start() 后即可触发异步执行。

import time
import threading

def sing(**kwargs):
    while True:
        print(kwargs["name"], "在唱歌")
        time.sleep(1)

def dance():
    while True:
        print("正在跳舞")
        time.sleep(1)

if __name__ == '__main__':
    t_sing = threading.Thread(target=sing, kwargs={"name": "张三"})
    t_dance = threading.Thread(target=dance)
    t_sing.start()
    t_dance.start()

第2步:控制线程生命周期(daemon 与 join)

守护线程(daemon): 当 daemon=True 时,主线程退出会强制终止所有子线程;默认为 False,即主线程会等待所有非守护子线程执行完毕后再结束。

import time
import threading

count = 0
def worker(name):
    global count
    while count < 3:
        count += 1
        print(f"{name} 工作...")
        time.sleep(0.5)
        threading.Thread(target=worker, args=("子线程",)).start()

if __name__ == '__main__':
    main_thread = threading.Thread(target=worker, args=("主线程",), daemon=False)
    main_thread.start()

线程阻塞(join): 在并发场景中,若需等待特定线程完成后才继续后续逻辑,可使用 join() 方法。该方法会使调用方线程暂停,直至目标线程终止。

import time
import threading

class TaskThread(threading.Thread):
    def __init__(self, name):
        super().__init__()
        self.name = name
    def run(self):
        for i in range(3):
            print(i, self.name, time.ctime(time.time()))
            time.sleep(0.5)

t_a = TaskThread("线程A")
t_a.start()

for i in range(5):
    print("主流程步骤", i)
    if i == 2:
        t_a.join()  # 阻塞主流程,直到线程A执行完毕

第3步:线程同步与互斥锁

多个线程同时读写共享可变数据时会引发竞态条件。使用 threading.Lock() 或 threading.RLock() 可实现简单的互斥同步。acquire() 相当于加锁,release() 相当于解锁。未获锁的线程将阻塞等待。

典型场景为多窗口并发售票:若无锁保护,两窗口可能同时读取到同一剩余票数并完成扣减,导致超售。

多线程无锁并发导致的超售逻辑示意图
展示多线程未加同步锁时共享变量 race condition 的执行结果对照

import time
import threading

class TicketWindow(threading.Thread):
    def __init__(self, name):
        super().__init__()
        self.name = name
    def run(self):
        global tickets
        while tickets > 0:
            lock.acquire()
            if tickets <= 0:
                break
            print(f"{self.name} 卖出第 {tickets} 张票")
            tickets -= 1
            time.sleep(0.5)
            lock.release()

tickets = 5
lock = threading.Lock()  # 创建互斥锁实例

w1 = TicketWindow("窗口一")
w2 = TicketWindow("窗口二")
w1.start()
w2.start()

加锁后,tickets 在修改期间被其他线程拦截,确保数据读写一致性。

Socket网络编程:客户端与服务端交互

Python 标准库 socket 模块提供了底层 TCP/IP 通信能力。通过套接字(Socket)可实现服务器监听与客户端主动连接的标准 C/S 架构。

第1步:搭建服务端

服务端需依次完成:创建 Socket 对象 → bind() 绑定地址端口 → listen() 开启监听队列 → accept() 阻塞接收连接 → recv()/send() 进行字节收发 → close() 释放资源。

import socket

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(("localhost", 8888))  # 绑定本机IP与端口
server.listen(5)  # 设置最大排队连接数

while True:
    conn, addr = server.accept()
    print("客户端已连接:", addr)
    
    data = conn.recv(1024).decode("utf-8")
    if data == "exit":
        conn.send("再见".encode())
        conn.close()
        break
    print("收到消息:", data)
    
    response = input("输入回复内容: ")
    conn.send(response.encode())
    conn.close()

server.close()

第2步:实现客户端

客户端通过 connect() 主动发起握手,随后使用 send() 发送字节数据,recv() 接收响应,最后关闭套接字。

import socket

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(("localhost", 8888))  # 连接服务端地址

msg = input("请输入要发送的数据: ")
client.send(msg.encode())
resp = client.recv(1024).decode("utf-8")
print("服务器返回:", resp)

client.close()

以下为典型的终端运行效果示意:

Socket服务端终端运行界面截图
显示服务端监听端口及客户端接入日志

Socket客户端终端运行界面截图
显示客户端发送指令与接收回显的控制台输出

正则表达式实战:匹配规则与常用方法

正则表达式(Regex)是一套用于模式匹配的字符序列。Python 借助 re 模块原生支持全部正则功能,核心函数包含 match、search 与 findall。

常用函数对比

  • re.match(pattern, string):仅从字符串起始位置尝试匹配,失败返回 None。
  • re.search(pattern, string):扫描整个字符串,返回第一个成功匹配的位置。
  • re.findall(pattern, string):查找所有符合条件的子串,返回列表。若模式包含分组则返回元组列表。
import re

text = "hi hello world hi"
res1 = re.match(r"hello", text)       # 返回 None(开头不匹配)
res2 = re.search(r"hello", text)      # 成功,span=(3, 8)
res3 = re.findall(r"\w+", text)       # ['hi', 'hello', 'world', 'hi']

核心修饰符与元字符速查

符号含义符号含义
^匹配字符串开头$匹配字符串结尾
.除换行外的任意单字符[ ]匹配括号内任一字符
\w字母、数字、下划线\d数字 [0-9]
*前项 0~N 次+前项 1~N 次
?前项 0~1 次{m,n}前项 m~n 次

可选标志可通过按位或 | 组合,例如:re.I | re.M。下表列出常用标志:

标识符作用
re.I忽略大小写
re.S使 . 匹配换行符
re.M多行模式,影响 ^ 和 $ 的行首行尾定位

实战校验示例

import re

# 1. 账号校验:6-16位英文数字
rule_acct = r'^[0-9a-zA-Z]{6,16}$'
print(bool(re.match(rule_acct, 'User_123')))  # True

# 2. 手机号校验:1开头,第二位3/5/8,共11位纯数字
rule_phone = r'^1[358]\d{9}$'
print(bool(re.match(rule_phone, '13812345678')))  # True

# 3. 邮箱格式校验:10位数字@后缀.com
rule_email = r'^[0-9]{10}@(qq|136|gmail)\.com$'
print(bool(re.match(rule_email, '1234567890@qq.com')))

以上就是Python多线程、网络编程与正则表达式详细内容的详细内容,更多关于Python高级特性与并发处理的资料请关注本站其它相关文章!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。