标签:dom sleep 开启 有一个 多进程 class res 并发 random
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) # 给线程池放任务,传参
标签:dom sleep 开启 有一个 多进程 class res 并发 random
原文地址:https://www.cnblogs.com/lyoko1996/p/11328872.html