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()

在这里插入图片描述

posted @ 2022-03-26 16:13  xiongsheng  阅读(45)  评论(0编辑  收藏  举报