Python3.6-asyncio-协程入门

协程概念

1.协程是单线程。
2.协程比线程轻量,在多任务并发场景下,多任务在单个线程中轮流切换使用CPU,比多线程效率高。
3.因为是单线程,所以不需要考虑线程安全问题。
4.因为是单线程,所以无法利用CPU多核优势,可以配合多进程利用CPU多核满足一些极限场景。

协程关键字

1.async关键字

用来修饰函数,使其成为一个coroutine(协程)对象

async def get_url(url):  # 被async修饰过的函数就是个协程对象,不能用普通函数调用方式调用
    print(threading.current_thread().ident, url)  # 打印出线程ID
    try:
        resp = requests.get(url, timeout=1)
    except(ReadTimeout,ConnectTimeout):
        return 'ReadTimeout OR ConnectTimeout'
    return resp

2.await关键字

  1. await用在修饰IO阻塞代码处,其只能修饰协程对象。
  2. 当阻塞代码运行完毕,await也起到获取其返回结果的作用
asy
尽管当前讨论基于 Python 3.8,但在 Python 3.6 中 `asyncio` 模块的核心功能已经非常成熟[^1]。以下是关于 Python 3.6 中 `asyncio` 模块的使用指南以及一些示例代码。 ### 关于 asyncio 基础 `asyncio` 是一个用于编写单线程并发代码的库,它利用协程、事件循环和 Futures 实现异步 I/O 操作。在 Python 3.6 中,`async/await` 语法已经被引入,这使得编写协程更加直观和简洁[^2]。 #### 创建简单的协程 下面是一个基本的例子展示如何定义和运行一个协程: ```python import asyncio async def say_hello(): await asyncio.sleep(1) # Simulate an asynchronous operation. print("Hello, world!") loop = asyncio.get_event_loop() # Get the event loop. try: loop.run_until_complete(say_hello()) # Run until the coroutine completes. finally: loop.close() ``` 这段代码展示了如何创建一个简单的协程函数,并通过事件循环来执行它。注意,在 Python 3.7 及之后版本中可以使用 `asyncio.run()` 方法简化这一过程,但由于问题是针对 Python 3.6 的环境,因此仍需手动获取和关闭事件循环。 #### 并发执行多个任务 如果需要同时运行多个协程,则可以通过 `asyncio.gather()` 或者 `ensure_future()` 来实现这一点: ```python async def count_down(name, delay): while True: await asyncio.sleep(delay) print(f"{name} is counting down...") async def main(): task1 = asyncio.ensure_future(count_down('Task A', 1)) task2 = asyncio.ensure_future(count_down('Task B', 2)) try: await asyncio.sleep(5) # Let tasks run for a few seconds... finally: task1.cancel() task2.cancel() if __name__ == "__main__": loop = asyncio.get_event_loop() try: loop.run_until_complete(main()) except KeyboardInterrupt: pass finally: loop.close() ``` 在这个例子中,两个不同的计数器被设置为不同延迟时间间隔下重复打印消息的任务。当主线程中的等待结束或者接收到键盘中断信号时,这些子任务会被取消。 ### 高级主题:集成 Redis 客户端 对于希望进一步探索异步编程潜力的人来说,结合第三方库如 `asyncio_redis` 能够极大提升效率与性能表现[^4]。例如连接到 Redis 数据库并执行命令如下所示: ```python import asyncio import asyncio_redis async def example(): connection = await asyncio_redis.Connection.create(host='localhost', port=6379) # Set key and get it back again. await connection.set('key', 'value') result = await connection.get('key') assert result == b'value' connection.close() if __name__ == '__main__': loop = asyncio.get_event_loop() loop.run_until_complete(example()) ``` 此脚本演示了怎样建立同本地实例化 Redis 的链接,存储键值对数据项后再读取出来验证其准确性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值