python异步编程

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)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值