Python多线程问题如何解决?
面试官让谈谈 python 多线程,怎么把这个问题说清楚?
Python多线程问题如何解决?
gil
Python里多线程的问题,核心就一个:全局解释器锁(GIL)。这玩意儿让Python的多线程在CPU密集型任务上基本没用,因为同一时间只有一个线程能执行Python字节码。
如果你的任务是I/O密集型(比如网络请求、读写文件),用threading模块没问题,线程在等待I/O时GIL会被释放,其他线程可以干活。举个例子,爬虫同时请求多个网址:
import threading
import requests
def fetch_url(url):
response = requests.get(url)
print(f"{url}: {len(response.content)} bytes")
urls = ["https://httpbin.org/delay/1"] * 5 # 模拟5个延迟1秒的请求
threads = []
for url in urls:
t = threading.Thread(target=fetch_url, args=(url,))
t.start()
threads.append(t)
for t in threads:
t.join()
print("所有请求完成")
如果你的任务是CPU密集型(比如计算圆周率、图像处理),别用threading,改用multiprocessing创建真正的进程,每个进程有独立的Python解释器和内存空间,能绕过GIL用上多核:
from multiprocessing import Pool
import math
def compute(n):
# 模拟一个耗时的CPU计算
return sum(math.sqrt(i) for i in range(n))
if __name__ == '__main__':
with Pool(processes=4) as pool: # 创建4个进程
results = pool.map(compute, [10**6] * 8) # 8个任务并行
print(f"计算结果: {results[:2]}...") # 只打印前两个结果示意
新选择:concurrent.futures 这个高级接口更简洁,线程池用ThreadPoolExecutor,进程池用ProcessPoolExecutor,用法几乎一样:
from concurrent.futures import ThreadPoolExecutor, as_completed
import requests
with ThreadPoolExecutor(max_workers=5) as executor:
futures = {executor.submit(requests.get, url): url for url in urls}
for future in as_completed(futures):
data = future.result()
print(f"{futures[future]}: {len(data.content)} bytes")
简单总结:I/O瓶颈用线程,CPU瓶颈用进程。
垃圾,除了爬虫之外基本上没用
多线程和python有什么必然的联系吗?
CPython 多线程还不如单线程
你和他谈异步, 谈 aio, 谈 twisted, 谈并发和并行的区别
没什么好谈的
他估计是想问异步吧
多线程洗洗睡
python 谈谈协程还实在一点,多线程?
先给我来个 1000 核的机器
为啥评论里面那么多对 Python 多线程不屑一顾的人?就算有 GIL,又不是所有多线程应用都是用来解决运算密集型问题的;虽然 IO 的问题大多数可以用异步解决,不过考虑到版本、兼容性、易用性等问题,又不是多线程不能用
Python 的多线程是一个大坑,效率都不是最严重的问题

