python多线程

Python 的多线程与其他一些编程语言(如 Java 或 C++)中的多线程有所不同,因为 Python 有一个全局解释器锁(GIL, Global Interpreter Lock)。GIL 确保任何时候只有一个线程可以执行 Python 字节码。这意味着,尽管你可能有多个线程在 Python 中运行,但它们实际上并不会同时执行 Python 字节码,而是会串行地执行。

然而,这并不意味着 Python 的多线程没有用。对于 I/O 密集型任务(如网络请求或文件读写),多线程仍然可以提高效率,因为当一个线程在等待 I/O 操作完成时,其他线程可以继续执行。

以下是一个简单的 Python 多线程示例,使用 threading 模块:

复制代码

python复制代码

|---|---------------------------------------------------|
| | import threading |
| | import time |
| | |
| | def worker(num): |
| | """线程工作函数""" |
| | print(f'Worker {num} is working...') |
| | time.sleep(2) # 模拟耗时操作 |
| | print(f'Worker {num} done.') |
| | |
| | # 创建线程列表 |
| | threads = [] |
| | |
| | # 创建并启动 5 个线程 |
| | for i in range(5): |
| | t = threading.Thread(target=worker, args=(i,)) |
| | threads.append(t) |
| | t.start() |
| | |
| | # 等待所有线程完成 |
| | for t in threads: |
| | t.join() |
| | |
| | print('All workers done.') |

在这个示例中,我们创建了一个名为 worker 的函数,该函数模拟了一个耗时操作(使用 time.sleep(2))。然后,我们创建了 5 个线程,每个线程都运行 worker 函数,并传入一个不同的参数。最后,我们使用 join() 方法等待所有线程完成。

请注意,尽管我们创建了多个线程,但由于 GIL 的存在,这些线程并不会同时执行 worker 函数中的 Python 字节码。但是,由于 time.sleep(2) 是一个 I/O 操作(在这种情况下是一个模拟的 I/O 操作),它不会受到 GIL 的影响,因此多个线程可以"同时"进入睡眠状态,并在之后"同时"醒来。这就是为什么在这个示例中,使用多线程仍然可以提高效率。

如果你需要进行 CPU 密集型计算,并且希望并行执行这些计算以提高性能,那么你可能需要考虑使用其他方法,如多进程(使用 multiprocessing 模块)或异步编程(使用 asyncio 模块)。

相关推荐
武子康1 小时前
Java-80 深入浅出 RPC Dubbo 动态服务降级:从雪崩防护到配置中心秒级生效
java·分布式·后端·spring·微服务·rpc·dubbo
mortimer2 小时前
安装NVIDIA Parakeet时,我遇到的两个Pip“小插曲”
python·github
@昵称不存在3 小时前
Flask input 和datalist结合
后端·python·flask
赵英英俊3 小时前
Python day25
python
东林牧之3 小时前
Django+celery异步:拿来即用,可移植性高
后端·python·django
何双新4 小时前
基于Tornado的WebSocket实时聊天系统:从零到一构建与解析
python·websocket·tornado
YuTaoShao4 小时前
【LeetCode 热题 100】131. 分割回文串——回溯
java·算法·leetcode·深度优先
源码_V_saaskw4 小时前
JAVA图文短视频交友+自营商城系统源码支持小程序+Android+IOS+H5
java·微信小程序·小程序·uni-app·音视频·交友
超浪的晨4 小时前
Java UDP 通信详解:从基础到实战,彻底掌握无连接网络编程
java·开发语言·后端·学习·个人开发
AntBlack4 小时前
从小不学好 ,影刀 + ddddocr 实现图片验证码认证自动化
后端·python·计算机视觉