首页 > 编程语言 >python异步

python异步

时间:2024-08-20 17:06:30浏览次数:9  
标签:异步 python 循环 线程 事件 loop asyncio

fastapi 是一个异步的web框架。

Starlette 是一个轻量级、快速的 Python ASGI 框架,专为构建高性能异步 Web 应用和微服务而设计。它是 FastAPI 的核心依赖之一,许多 FastAPI 的功能都基于 Starlette 提供的组件。Starlette 以其简洁的设计和丰富的功能而著称,非常适合构建现代异步 Web 应用。

uvicorn 是一个快速、轻量级的 Python ASGI(Asynchronous Server Gateway Interface)服务器,专为运行高性能的异步 Web 应用和框架而设计。uvicorn 是使用 uvloop 和 httptools 构建的,这使它在处理 HTTP 请求时表现出色,尤其适用于基于异步 I/O 的应用。

uvloop 是一个用于 Python 的高性能事件循环,它是 asyncio 的一个替代实现。uvloop 是基于 libuv 构建的,libuv 是一个跨平台的异步 I/O 库,广泛用于 Node.js 和其他异步系统中。

fastapi的ASGI服务器是可选的,一般会选择uvicorn。
uvicorn的事件循环也是可选的,一般默认使用asyncio默认的事件循环,也可以设置为uvloop。

事件循环:

  • 单线程:在单个线程中只能有一个活动的事件循环。
  • 多线程:你可以在不同的线程中创建和运行各自的事件循环,但每个线程只能有一个事件循环在运行。

asyncio.get_event_loop():
用于获取当前线程的事件循环。如果不存在,则创建并返回一个新的。
适合主线程中的异步任务启动或管理。

asyncio.get_running_loop():
用于获取当前正在运行的事件循环。如果没有运行的事件循环则抛出错误。
适合在已经运行的协程或回调函数中使用。

asyncio.new_event_loop():
总是创建并返回一个新的事件循环实例,不会自动设置为当前线程的事件循环。
适合需要手动管理事件循环的场景,特别是在多线程或测试环境中。

windows系统事件循环策略: asyncio模块使用的windows系统的默认的事件循环策略。
asyncio.WindowsSelectorEventLoopPolicy: Python 3.7 及之前的版本
asyncio.WindowsProactorEventLoopPolicy: Python 3.8 及之后的版本

uvloop.EventLoopPolicy(): uvloop自己的事件循环策略

有时候,可能是一些库WindowsProactorEventLoopPolicy支持的不好,在使用asyncio.run()运行异步函数时经常报event loop is closed这样的错误,这时可以考虑改变事件循环策略。
asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
或者使用旧的方式运行异步函数:

loop = asyncio.get_event_loop()
loop.run_until_complete(fun())

事件循环的创建:
asyncio.run()函数会自动创建一个事件循环
像web框架,比如fastapi,会在服务器启动时自动创建一个事件循环。
uvicorn.run(f"{app_model_name}:app", host='0.0.0.0', reload=False)
在单线程中,可以使用asyncio.get_event_loop()来创建。
在多线程中,一般在子线程中使用asyncio.new_event_loop()来创建子线程自已的事件循环。
当你明确知道代码是在事件循环中运行时,可以用asyncio.get_running_loop()方法获取当前运行的事件循环, 一般用于异步函数内部。

下面是一个在子线程中使用事件循环的示例:

import asyncio
import threading

async def hello():
    print(f"Hello from thread {threading.current_thread().name}")
    await asyncio.sleep(1)
    print(f"Goodbye from thread {threading.current_thread().name}")

def start_loop():
    loop = asyncio.new_event_loop()  # 创建一个新的事件循环
    asyncio.set_event_loop(loop)     # 设置为当前线程的事件循环
    loop.run_until_complete(hello())

# 在主线程中运行一个事件循环
asyncio.run(hello())

# 在一个子线程中运行另一个事件循环
thread = threading.Thread(target=start_loop)
thread.start()
thread.join()

标签:异步,python,循环,线程,事件,loop,asyncio
From: https://www.cnblogs.com/rolandhe/p/18369810

相关文章

  • 基于python+flask框架的家政服务网上预约与管理系统(开题+程序+论文) 计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景在快节奏的现代生活中,家政服务成为了许多家庭不可或缺的一部分,它极大地便利了人们的日常生活,提高了生活质量。然而,传统的家政服务预约方式......
  • 基于python+flask框架的智能旅游线路规划系统设计与实现(开题+程序+论文) 计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着旅游业的蓬勃发展和科技的日新月异,人们对旅游体验的需求日益多元化与个性化。传统的旅游线路规划往往依赖于旅行社的固定套餐或个人的......
  • python ssh上传文件到linux并解压
    importparamikoimportosdefupload_and_unzip(local_file,remote_file,zip_dir):#创建SSH客户端ssh=paramiko.SSHClient()ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())private_key_path=r'F:\mysite.pem'#加载私钥文件......
  • Python面试中常见的知识点和问题
    Python面试中常见的知识点和问题,供你参考: ###基础知识1.**数据类型**:  -基本类型:int,float,str,bool  -容器类型:list,tuple,set,dict 2.**控制结构**:  -条件语句:if,elif,else  -循环语句:for,while 3.**函数**:  -定义函数:def......
  • 使用python-slim镜像遇到无法使用PostgreSQL的问题
    前言之前不是把DjangoStarter的docker方案重新搞好了吗一开始demo部署是使用SQLite数据库的,用着没问题,但很快切换到PostgreSQL的时候就遇到问题了…报错docker启动之后,app容器报错django.core.exceptions.ImproperlyConfigured:Errorloadingpsycopg2orpsycopg......
  • Python学习日记(Page.3)
    今日整理方便日后回顾。如有错误欢迎指正。  今天总结一下字符串扩展的内容。第一部分字符串的三种定义方式 单引号name='黑马'   2.双引号name="黑马"   3.三引号name="""黑马"""注:单引号可包含双引号,但不能包含单引号双引号可包含单......
  • CentOS Python 3.12安装
    之前从来没想到我会在安装Python这点上卡住,事实上最近就是在一个CentOS测试机上安装Python时遇到了问题,因此记一下。以往我们使用yum安装python时非常简单:yuminstallpythonoryuminstallpython3最多额外再加装个pip以及python-devel,就算需要某个特定的、yum无法覆盖的......
  • python环境安装之后,cmd输入python回车会打开微软商店
    坑爹!python环境安装之后,cmd输入python回车会打开微软商店最近发现,安装python环境成功之后,可能会出现cmd输入python验证是否安装成功老会打开微软商店!解决,打开系统环境配置,找到刚安装python环境的时候加入的python安装路径你会发现这个windowsapp在python安装目录前面,把w......
  • 在Python中使用MySQL:保姆级指南
    Python是一种广泛使用的高级编程语言,因其简洁易读以及强大的库支持而受到开发者的青睐。当需要在Python程序中处理数据库时,MySQL是一个流行的选择。MySQL是一个开源的关系数据库管理系统,广泛用于Web应用程序的开发。目录第一步:安装MySQL数据库第二步:安装MySQLConnector第......
  • python实用教程(二):安装配置Pycharm及使用(Win10)
    上一篇:python实用教程(一):安装配置anaconda(Win10)-CSDN博客1、简介及下载PyCharm是一款功能强大的Python编辑器,具有跨平台性。是Jetbrains家族中的一个明星产品。下载地址:DownloadPyCharm:ThePythonIDEfordatascienceandwebdevelopmentbyJetBrains由于个人用......