python GIL锁
GIL锁
GIL 全局解释器(Global Interpreter lock), 是cpython 解释器特有的,让一个进程中同一个时刻只能有一个线程可以被CPU调用。
如果程序想利用计算机的多核优势,让cpu同时处理一些任务,适合用多进程开发(即使资源开销大)。
如果程序不利用计算机的多核优势,适合用多线程开发。
常见的程序开发中,计算机操作需要使用CPU多核优势,IO操作不需要利用CPU的多核优势
所有
1.计算密集型,用多进程,例如:大量的数据计算【累加计算示例】
2.IO密集型,用多线程,例如: 文件读写,网络数据传输【下载抖音视频示例】
累计计算示例(计算密集型):
- 串行处理
"""进程和线程"""
import time
start = time.time()
result = 0
for i in range(100000):
result += 1
print(result)
end = time.time()
# 耗时
print("耗时:", end - start)
- 多进程处理
"""多进程处理"""
import time
import multiprocessing
def task(start, end, queue):
result = 0
for i in range(start, end):
result += i
queue.put(result)
if __name__ == '__main__':
queue = multiprocessing.Queue()
start_time = time.time()
p1 = multiprocessing.Process(target=task, args=(0, 50000, queue))
p1.start()
p2 = multiprocessing.Process(target=task, args=(0, 60000, queue))
p2.start()
v1 = queue.get(block=True)
v2 = queue.get(block=True)
print((v1 + v2))
end_time = time.time()
print("耗时:", end_time - start_time)
当然 ,在程序开发中 多线程 和多进程 是可以结合在一起使用的
例如:创建2个进程(建议与CPU个数相同),每个进程中创建3个线程
""" 多线程多进程同时使用"""
import multiprocessing
import threading
def thread_task():
print("8888888888888888888888888")
def task(start, end):
t1 = threading.Thread(target=thread_task)
t1.start()
t2 = threading.Thread(target=thread_task)
t2.start()
t3 = threading.Thread(target=thread_task)
t3.start()
if __name__ == '__main__':
p1 = multiprocessing.Process(target=task, args=(0, 1000))
p1.start()
p2 = multiprocessing.Process(target=task, args=(50000, 2000))
p2.start()
python