当前位置:首页 > 科技  > 软件

我们一起聊聊Python协程和异步编程

来源: 责编: 时间:2023-11-30 09:30:21 429观看
导读协程和异步编程是Python中处理并发和异步任务的重要概念。协程是一种轻量级的并发编程方式,它允许程序在执行过程中暂停和恢复,以便处理其他任务。异步编程模型则是基于协程的一种编程风格,它通过使用非阻塞的异步IO操作

协程和异步编程是Python中处理并发和异步任务的重要概念。协程是一种轻量级的并发编程方式,它允许程序在执行过程中暂停和恢复,以便处理其他任务。异步编程模型则是基于协程的一种编程风格,它通过使用非阻塞的异步IO操作来提高程序的并发性能。4P628资讯网——每日最新资讯28at.com

4P628资讯网——每日最新资讯28at.com

Python中的异步编程主要依赖于`asyncio`模块。`asyncio`提供了一套用于编写异步代码的工具和框架,包括协程、事件循环和异步IO操作等。4P628资讯网——每日最新资讯28at.com

4P628资讯网——每日最新资讯28at.com

代码示例:4P628资讯网——每日最新资讯28at.com

1. 使用`async`和`await`定义协程函数:4P628资讯网——每日最新资讯28at.com

import asyncioasync def my_coroutine():    await asyncio.sleep(1)    print("Coroutine executed")asyncio.run(my_coroutine())

2. 使用`asyncio.create_task()`并发运行多个协程:4P628资讯网——每日最新资讯28at.com

import asyncioasync def coroutine1():    await asyncio.sleep(1)    print("Coroutine 1 executed")async def coroutine2():    await asyncio.sleep(2)    print("Coroutine 2 executed")async def main():    task1 = asyncio.create_task(coroutine1())    task2 = asyncio.create_task(coroutine2())    await asyncio.gather(task1, task2)asyncio.run(main())

3. 使用`asyncio.wait()`等待多个协程完成:4P628资讯网——每日最新资讯28at.com

import asyncioasync def coroutine1():    await asyncio.sleep(1)    print("Coroutine 1 executed")async def coroutine2():    await asyncio.sleep(2)    print("Coroutine 2 executed")async def main():    tasks = [coroutine1(), coroutine2()]    done, pending = await asyncio.wait(tasks)    for task in done:        print(f"Task {task} completed")asyncio.run(main())

4. 使用`asyncio.Lock()`实现协程间的互斥访问:4P628资讯网——每日最新资讯28at.com

import asyncioasync def counter(lock):    async with lock:        for _ in range(5):            print("Counting")            await asyncio.sleep(1)async def main():    lock = asyncio.Lock()    tasks = [counter(lock) for _ in range(3)]    await asyncio.gather(*tasks)asyncio.run(main())

5. 使用`asyncio.Queue()`实现协程间的消息传递:4P628资讯网——每日最新资讯28at.com

import asyncioasync def producer(queue):    for i in range(5):        await queue.put(i)        print(f"Produced: {i}")        await asyncio.sleep(1)async def consumer(queue):    while True:        item = await queue.get()        print(f"Consumed: {item}")        await asyncio.sleep(2)async def main():    queue = asyncio.Queue()    producer_task = asyncio.create_task(producer(queue))    consumer_task = asyncio.create_task(consumer(queue))    await asyncio.gather(producer_task, consumer_task)asyncio.run(main())

6. 使用`asyncio.TimeoutError`设置协程的超时:4P628资讯网——每日最新资讯28at.com

import asyncioasync def my_coroutine():    await asyncio.sleep(2)    print("Coroutine executed")async def main():    try:        await asyncio.wait_for(my_coroutine(), timeout=1)    except asyncio.TimeoutError:        print("Coroutine timed out")asyncio.run(main())

7. 使用`asyncio.run_in_executor()`在协程中执行阻塞的同步操作:4P628资讯网——每日最新资讯28at.com

import asynciodef sync_operation():    # 阻塞的同步操作    return "Sync result"async def main():    loop = asyncio.get_running_loop()    result = await loop.run_in_executor(None, sync_operation)    print(f"Result: {result}")asyncio.run(main())

8. 使用`aiohttp`库进行异步HTTP请求:4P628资讯网——每日最新资讯28at.com

import asyncioimport aiohttpasync def fetch_data(url):    async with aiohttp.ClientSession() as session:        async with session.get(url) as response:            return await response.text()async def main():    url = "https://api.example.com/data"    data = await fetch_data(url)    print(f"Data: {data}")asyncio.run(main())

9. 使用`asyncio.sleep()`模拟异步计时器:4P628资讯网——每日最新资讯28at.com

import asyncioasync def timer(duration):    await asyncio.sleep(duration)    print(f"Timer finished after {duration} seconds")async def main():    tasks = [timer(1), timer(2), timer(3)]    await asyncio.gather(*tasks)asyncio.run(main())

10. 使用`asyncio`实现并发的文件IO操作:4P628资讯网——每日最新资讯28at.com

import asyncioasync def read_file(file):    async with asyncio.open_file(file, "r") as f:        contents = await f.read()        print(f"Read from {file}: {contents}")async def write_file(file, data):    async with asyncio.open_file(file, "w") as f:        await f.write(data)        print(f"Wrote to {file}")async def main():    file = "data.txt"    await write_file(file, "Hello, world!")    await read_file(file)asyncio.run(main())

4P628资讯网——每日最新资讯28at.com

这些场景代码展示了协程和异步编程的使用方式。通过使用`asyncio`模块和相关的工具,我们可以轻松地编写并发和异步任务处理的代码,提高程序的性能和响应能力。4P628资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-35336-0.html我们一起聊聊Python协程和异步编程

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 优雅的springboot参数校验,你学会了吗?

下一篇: 揭秘Git高手的十个秘密武器:让你的工作效率飙升!

标签:
  • 热门焦点
  • vivo TWS Air开箱体验:真轻 臻好听

    在vivo S15系列新机的发布会上,vivo的最新款真无线蓝牙耳机vivo TWS Air也一同发布,本次就这款耳机新品给大家带来一个简单的分享。外包装盒上,vivo TWS Air保持了vivo自家产
  • JavaScript 混淆及反混淆代码工具

    介绍在我们开始学习反混淆之前,我们首先要了解一下代码混淆。如果不了解代码是如何混淆的,我们可能无法成功对代码进行反混淆,尤其是使用自定义混淆器对其进行混淆时。什么是混
  • 从 Pulsar Client 的原理到它的监控面板

    背景前段时间业务团队偶尔会碰到一些 Pulsar 使用的问题,比如消息阻塞不消费了、生产者消息发送缓慢等各种问题。虽然我们有个监控页面可以根据 topic 维度查看他的发送状态,
  • Flowable工作流引擎的科普与实践

    一.引言当我们在日常工作和业务中需要进行各种审批流程时,可能会面临一系列技术和业务上的挑战。手动处理这些审批流程可能会导致开发成本的增加以及业务复杂度的上升。在这
  • 量化指标是与非:挽救被量化指标扼杀的技术团队

    作者 | 刘新翠整理 | 徐杰承本文整理自快狗打车技术总监刘新翠在WOT2023大会上的主题分享,更多精彩内容及现场PPT,请关注51CTO技术栈公众号,发消息【WOT2023PPT】即可直接领取
  • 一文掌握 Golang 模糊测试(Fuzz Testing)

    模糊测试(Fuzz Testing)模糊测试(Fuzz Testing)是通过向目标系统提供非预期的输入并监视异常结果来发现软件漏洞的方法。可以用来发现应用程序、操作系统和网络协议等中的漏洞或
  • 一个注解实现接口幂等,这样才优雅!

    场景码猿慢病云管理系统中其实高并发的场景不是很多,没有必要每个接口都去考虑并发高的场景,比如添加住院患者的这个接口,具体的业务代码就不贴了,业务伪代码如下:图片上述代码有
  • 外交部:美方应停止在网络安全问题上不负责任地指责他国

      中国外交部今天(16日)举行例行记者会。会上,有记者问,美国情报官员称,他们正在阻拦来自中国以及其他国家的黑客获取相关科研成果。 中方对此有何评论?对此
  • 利用职权私自解除被封帐号 Meta开除20多名员工

    11月18日消息,据外媒援引知情人士表示,过去一年时间内,Facebook母公司Meta解雇或处罚了20多名员工以及合同工,指控这些人通过内部系统以不当方式重置用户帐号,其
Top