http://cenalulu.github.io/python/gil-in-python/
python中的GIL(全局解析器锁,Global Interpreter Lock)
GIL并不是Python的特性,它是在实现Python解析器(CPython)时所引入的一个概念。
Python有很多个解析器(CPython,PyPy,Psyco等),所以GIL并不是Python的特性,Python完全可以不依赖于GIL。
官方解释:一个防止多线程并发执行机器码的一个Mutex
In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple native threads from executing Python bytecodes at once. This lock is necessary mainly because CPython’s memory management is not thread-safe. (However, since the GIL exists, other features have grown to depend on the guarantees that it enforces.)
Why GIL?
解决多线程之间数据完整性和状态同步的最简单方法自然就是加锁, 于是有了GIL这把超级大锁,而当越来越多的代码库开发者接受了这种设定后,他们开始大量依赖这种特性(即默认python内部对象是thread-safe的,无需在实现时考虑额外的内存锁和同步操作)。
总结
Python的多线程在多核CPU上,只对于IO密集型计算产生正面效果;而当有至少有一个CPU密集型线程存在,那么多线程效率会由于GIL而大幅下降。
python 异步编程之asyncio
前言
python由于GIL(全局锁)的存在,在CPU密集场景下不能发挥多核的优势,然而在IO密集型的网络编程里,异步处理比同步处理能提升成百上千倍的效率,弥补了python性能方面的短板。
相关概念
-
同步
先执行一个任务,如果阻塞了会一直等待,直到任务完成,再继续执行下一个任务。
-
异步
和同步相反,异步是指在开始执行一个任务后,不会去等待这个任务的处理结果,直接处理下一个任务,通过状态、通知、回调来通知调用者处理结果。
code
# coding=utf-8
# @Time : 2020/11/3 15:06
# @Author : Leo
# @Email : l1512102448@qq.com
# @File : http_asyc.py
'''
并发http请求
'''
from datetime import datetime
import asyncio
from aiohttp import ClientSession
async def hello(url):
'''
异步请求函数
:param url:
:return:
'''
async with ClientSession() as session:
async with session.get(url) as response:
response = await response.read()
# print(response)
print('Now time is %s' % datetime.now())
return response
if __name__ == '__main__':
tasks = []
url = "https://www.baidu.com/{}"
# 事件循环
loop = asyncio.get_event_loop()
for i in range(4000):
# 将异步函数hello()包装在asyncio的Future对象中,
task = asyncio.ensure_future(hello(url.format(i)))
tasks.append(task)
# 执行异步任务
loop.run_until_complete(asyncio.wait(tasks))
# 执行异步任务并收集执行结果
# results = loop.run_until_complete(asyncio.gather(*tasks))
# print(results)