- GIL锁.
GIL锁: 全局解释器锁. 就是一个把互斥锁,将并发变成串行,同一时刻只能有一个线程使用共享资源,牺牲效率,保证数据安全. 带来的问题1: ? 单进程的多线程不能利用多核. 诟病之一. ? 多进程的多线程可以利用多核. 带来的问题2: ? 感觉上不能并发的执行问题. 讨论: 单核处理IO阻塞的多线程,与多核处理IO阻塞的多线程效率差不多. # 多核的前提下: 如果任务Io密集型: 多线程并发.如果任务计算密集型: 多进程并发.
- GIL锁与互斥锁的关系.
# 1. GIL 自动上锁解锁, 文件中的互斥锁Lock 手动上锁解锁. # 2. GIL锁 保护解释器的数据安全. 文件的互斥锁Lock 保护的文件数据的安全. # 线程全部是计算密集型:当程序执行,开启100个线程时,第一个线程先要拿到GIL锁,然后拿到lock锁,释放lock锁,最后释放GIL锁.
- 进程池线程池.
进程池: 放置进程的一个容器. 线程池: 放置线程的一个容器. from concurrent.futures import ProcessPoolExecutor from concurrent.futures import ThreadPoolExecutor import time import os import random def task(name): print(name) print(f'{os.getpid()} 准备接客') time.sleep(random.randint(1,3)) if __name__ == '__main__': p = ProcessPoolExecutor() # 设置进程数量默认为cpu个数 for i in range(23): p.submit(task,1) # 给进程池放任务,传参 def task(name): print(name) print(f'{os.getpid()} 准备接客') time.sleep(random.randint(1,3)) if __name__ == '__main__': p = ThreadPoolExecutor() # ,默认cpu数量*5 for i in range(23): p.submit(task,1) # 给线程池放任务,传参
原文地址:https://www.cnblogs.com/lyoko1996/p/11328872.html
时间: 2024-11-09 10:03:00