标签归档:async

Uvloop-超高速异步事件循环

uvloop是内置异步事件循环的快速插入式替代。uvloop是用Cython实现的,并在幕后使用libuv可以在以下位置找到项目文档here请同时查看wiki

性能

uvloop使异步速度提高2-4倍

上图显示了具有不同消息大小的回应服务器的性能。这个插座基准使用loop.sock_recv()loop.sock_sendall()方法;溪流Benchmark使用异步高级流,由asyncio.start_server()函数;以及协议基准使用loop.create_server()使用简单的回声协议。阅读有关uvloop的更多信息,请参阅blog post关于这件事

安装

uvloop需要Python 3.7或更高版本,并且在PyPI上可用。使用pip安装它:

$ pip install uvloop

请注意,强烈建议您升级pip之前使用以下命令安装uvloop:

$ pip install -U pip

使用uvloop

打电话uvloop.install()在打电话之前asyncio.run()或手动创建异步事件循环:

import asyncio
import uvloop

async def main():
    # Main entry-point.
    ...

uvloop.install()
asyncio.run(main())

从源构建

要构建uvloop,您需要Python 3.7或更高版本:

  1. 克隆存储库:
    $ git clone --recursive git@github.com:MagicStack/uvloop.git
    $ cd uvloop
    
  2. 创建虚拟环境并将其激活:
    $ python3.7 -m venv uvloop-dev
    $ source uvloop-dev/bin/activate
    
  3. 安装开发依赖项:
    $ pip install -e .[dev]
    
  4. 构建和运行测试:
    $ make
    $ make test
    

许可证

uvloop在MIT和Apache 2.0许可下双重许可

Rq Python的简单作业队列

RQ(Redis队列)是一个简单的Python库,用于对作业进行排队并在后台与工作者一起处理它们。它是由Redis支持的,它的设计是为了有一个较低的屏障进入。它应该很容易集成到您的Web堆栈中

RQ需要Redis>=3.0.0



可以找到完整的文档here

支持RQ

如果您发现RQ有用,请考虑通过以下方式支持此项目Tidelift

快速入门

当然,首先要运行Redis服务器:

$ redis-server

要将作业放到队列中,您不必执行任何特殊操作,只需定义通常较长或阻塞的函数:

import requests

def count_words_at_url(url):
    """Just an example function that's called async."""
    resp = requests.get(url)
    return len(resp.text.split())

你确实用了优秀的requests包裹,不是吗?

然后,创建RQ队列:

from redis import Redis
from rq import Queue

queue = Queue(connection=Redis())

并将函数调用排队:

from my_module import count_words_at_url
job = queue.enqueue(count_words_at_url, 'http://nvie.com')

安排作业也同样简单:

# Schedule job to run at 9:15, October 10th
job = queue.enqueue_at(datetime(2019, 10, 8, 9, 15), say_hello)

# Schedule job to run in 10 seconds
job = queue.enqueue_in(timedelta(seconds=10), say_hello)

还支持重试失败的作业:

from rq import Retry

# Retry up to 3 times, failed job will be requeued immediately
queue.enqueue(say_hello, retry=Retry(max=3))

# Retry up to 3 times, with configurable intervals between retries
queue.enqueue(say_hello, retry=Retry(max=3, interval=[10, 30, 60]))

有关更完整的示例,请参阅docs但这才是最本质的

这位工人

要开始在后台执行入队的函数调用,请从项目的目录中启动一个工作器:

$ rq worker --with-scheduler
*** Listening for work on default
Got count_words_at_url('http://nvie.com') from default
Job result = 818
*** Listening for work on default

事情就是这样

安装

只需使用以下命令即可安装最新发布的版本:

pip install rq

如果您想要最先进的版本(很可能已损坏),请使用以下命令:

pip install git+https://github.com/nvie/rq.git@master#egg=rq

相关项目

请查看下面这些可能对您的基于RQ的项目有用的报告

项目历史记录

这个项目的灵感来自于CeleryResquethis snippet,并作为celery或其他基于amqp的排队实现的轻量级替代方案而创建。

Trio-Trio-用于异步并发和I/O的友好Python库

Trio项目的目标是生产一种生产质量高、permissively licensed,异步/等待-Python的本机I/O库。与所有异步库一样,它的主要目的是帮助您编写执行以下操作的程序同时做多件事使用并行I/O一个想要并行获取大量页面的网络蜘蛛,一个需要同时处理大量下载和websocket连接的网络服务器,一个监控多个子进程的进程管理程序。诸如此类的事情。与其他图书馆相比,Trio试图通过痴迷于可用性正确性并发性是复杂的;我们试图使其简单易懂去拿东西正确的

三人组是从头开始建造的,目的是利用latest
Python features
,并从以下方面获得灵感many sources,特别是戴夫·比兹利的Curio由此产生的设计从根本上比老的竞争对手要简单得多,比如asyncioTwisted,但同样有能力。Trio是我一直想要的Python I/O库;我发现它使构建面向I/O的程序变得更容易、更不容易出错,而且更有趣。Perhaps you’ll find the same

这个项目还很年轻,还有点实验性:总体设计是可靠的,现有的特性经过了充分的测试和记录,但是您可能会遇到功能缺失或边缘粗糙的问题。我们鼓励你使用它,但你应该read and
subscribe to issue #1
以获得警告,并有机会就任何破坏兼容性的更改提供反馈

下一站是哪里?

我想试试!太棒了!我们有一个friendly tutorial来帮助您入门;不需要以前的异步编码经验

呃,我不想看这些-给我看一些代码!如果你不耐烦,这里有一个simple concurrency example,一个echo client,和一个echo server

与竞争方法相比,Trio如何使程序更易于阅读和推理?TRIO基于一种我们称之为“结构化并发”的新思维方式。最好的理论介绍是这篇文章Notes on structured concurrency, or: Go statement
considered harmful
或,check out this talk at PyCon 2018观看在旧图书馆与Trio中实施“快乐眼球”算法的演示

酷,但它能在我的系统上工作吗?可能吧!只要您有某种Python3.6或更好的版本(CPython或最新的Py3都可以),并且使用的是Linux、MacOS、Windows或FreeBSD,那么Trio就可以工作。其他环境可能也可以工作,但这些都是我们测试的环境。我们所有的依赖项都是纯Python,除了Windows上的CFFI,它有轮子可用,所以安装应该很容易(不需要C编译器)

我试过了,但它不起作用听到这个我很难受!您可以尝试在我们的chat roomforumfiling a bug,或posting a
question on StackOverflow
,我们会尽最大努力帮助你

三人组很棒,我想让它变得更棒!你是最棒的!有大量的工作要做-填补缺失的功能,建立一个Trio使用库的生态系统,可用性测试(例如,也许可以试着教自己或朋友使用Trio,并列出您遇到的每条错误消息和您感到困惑的地方?),改进文档。请查看我们的guide
for contributors
好了!

我目前还没有使用它的计划,但我喜欢研究I/O库设计!这有点奇怪吗?但老实说,你会很适合这里的。我们有一个whole sub-forum
for discussing structured concurrency
(欢迎其他系统的开发人员!)或查看我们的discussion of design
choices
reading list,以及issues tagged design-discussion

我想确保我公司的律师不会生我的气!不用担心,Trio根据您选择的麻省理工学院或Apache2获得许可。LICENSE有关详细信息,请参阅

行为规范

请投稿人遵循我们的code of conduct在所有项目空间中

Fastapi-FastAPI框架,高性能,易学,编码速度快,可投入生产

FastAPI框架,高性能,易学,编码速度快,可投入生产


文档https://fastapi.tiangolo.com

源代码https://github.com/tiangolo/fastapi


FastAPI是一种现代、快速(高性能)的Web框架,用于使用Python 3.6+基于标准Python类型提示构建API

主要功能包括:

  • 快地:非常高的性能,可与节点JS(多亏了斯塔莱特和皮丹蒂克)One of the fastest Python frameworks available
  • 快速编码:提高功能开发速度约200%至300%。*
  • 更少的错误:减少约40%的人为(开发人员)引起的错误。*
  • 直观:强大的编辑支持。无处不在的完成度。调试时间更短
  • 简单易懂:设计成易于使用和学习。减少阅读文档的时间
  • 短的:最大限度地减少代码重复。来自每个参数声明的多个功能。更少的错误
  • 健壮:获取可投入生产的代码。使用自动交互文档
  • 基于标准的:基于(并完全兼容)API开放标准:OpenAPI(以前称为Swagger)和JSON Schema

*基于对内部开发团队、构建生产应用程序的测试进行估计

意见

[.]我在用FastAPI这几天有一吨多。[.]实际上我正计划把它用在我所有团队的微软的ML服务他们中的一些人正在融入核心窗口产品和一些办公室产品

卡比尔汗-微软(ref)

我们采用了FastAPI库以派生睡觉可以查询获取的服务器预测[路德维希]

皮耶罗·莫利诺,雅罗斯拉夫·杜丁和赛苏曼斯·米利亚拉-优步(Uber)(ref)

Netflix我很高兴地宣布我们的危机管理编排框架:派单好了![使用以下组件构建FastAPI]

凯文·格利森,马克·维拉诺瓦,福里斯特·蒙森-Netflix(ref)

我欣喜若狂FastAPI太好玩了!

布莱恩·奥肯-Python Bytes播客主持人(ref)

老实说,你建造的东西看起来非常坚固和精美。在很多方面,这是我想要的拥抱一下是-看到有人建造这样的建筑真的很鼓舞人心

蒂莫西·克罗斯利-Hug创建者(ref)

如果你想学一门现代框架要构建睡觉API,请查看FastAPI[.]它快速、易用、易学。

我们已经切换到FastAPI为了我们的API接口[.]我想你会喜欢的。

Ines Montani-Matthew Honnibal-Explosion AI创始人-spaCy创作者(ref)(ref)

要求

Python 3.6+

FastAPI站在巨人的肩膀上:

安装

$ pip install fastapi

---> 100%

您还需要一台ASGI服务器用于生产,例如UvicornHypercorn

$ pip install uvicorn[standard]

---> 100%

示例

创建它

  • 创建文件main.py使用:
from typing import Optional

from fastapi import FastAPI

app = FastAPI()


@app.get("/")
def read_root():
    return {"Hello": "World"}


@app.get("/items/{item_id}")
def read_item(item_id: int, q: Optional[str] = None):
    return {"item_id": item_id, "q": q}
或使用async def

如果您的代码使用async/await,使用async def

from typing import Optional

from fastapi import FastAPI

app = FastAPI()


@app.get("/")
async def read_root():
    return {"Hello": "World"}


@app.get("/items/{item_id}")
async def read_item(item_id: int, q: Optional[str] = None):
    return {"item_id": item_id, "q": q}

注意事项

如果您不知道,请查看“赶时间?”部分关于async and await in the docs

运行它

使用以下命令运行服务器:

$ uvicorn main:app --reload

INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO:     Started reloader process [28720]
INFO:     Started server process [28722]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
关于命令uvicorn main:app --reload

该命令uvicorn main:app指的是:

  • main:文件main.py(Python“模块”)
  • app:在中创建的对象main.py用这条线app = FastAPI()
  • --reload:使服务器在代码更改后重新启动。这样做只是为了发展。

检查一下

在以下位置打开您的浏览器http://127.0.0.1:8000/items/5?q=somequery

您将看到JSON响应为:

{"item_id": 5, "q": "somequery"}

您已经创建了一个API,该API:

  • 中接收HTTP请求。路径//items/{item_id}
  • 两者都有路径拿走GET运营(也称为HTTP方法:)
  • 这个路径/items/{item_id}有一个路径参数item_id这应该是一个int
  • 这个路径/items/{item_id}有一个可选的str查询参数q

交互式API文档

现在转到http://127.0.0.1:8000/docs

您将看到自动交互API文档(由提供Swagger UI):

替代API文档

现在,请转到http://127.0.0.1:8000/redoc

您将看到替代自动文档(由提供ReDoc):

示例升级

现在修改该文件main.py接收来自PUT请求

使用标准Python类型声明Body,这要归功于Pydatics

from typing import Optional

from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()


class Item(BaseModel):
    name: str
    price: float
    is_offer: Optional[bool] = None


@app.get("/")
def read_root():
    return {"Hello": "World"}


@app.get("/items/{item_id}")
def read_item(item_id: int, q: Optional[str] = None):
    return {"item_id": item_id, "q": q}


@app.put("/items/{item_id}")
def update_item(item_id: int, item: Item):
    return {"item_name": item.name, "item_id": item_id}

服务器应自动重新加载(因为您添加了--reload发送到uvicorn上述命令)

Interactive API文档升级

现在转到http://127.0.0.1:8000/docs

  • 交互API文档将自动更新,包括新的Body:

  • 点击[试用]按钮,即可填写参数,直接与接口交互:

  • 然后点击“执行”按钮,用户界面将与您的API进行通信,发送参数,得到结果并显示在屏幕上:

备用API文档升级

现在,请转到http://127.0.0.1:8000/redoc

  • 替代文档还将反映新的查询参数和正文:

概述

总而言之,您声明一次作为函数参数的参数类型、正文等

您可以使用标准的现代Python类型来实现这一点

您不必学习新语法、特定库的方法或类等

只是标准的Python 3.6+

例如,对于int

item_id: int

或者对于更复杂的Item型号:

item: Item

有了这一份声明,你就会得到:

  • 编辑器支持,包括:
    • 完成
    • 类型检查
  • 数据验证:
    • 数据无效时自动清除错误
    • 即使是针对深度嵌套的JSON对象的验证也是如此
  • 输入数据的转换:从网络到Python数据和类型的转换。阅读自:
    • JSON
    • 路径参数
    • 查询参数
    • 曲奇饼
    • 标题
    • 表格
    • 文件
  • 输出数据转换:从Python数据和类型转换为网络数据(如JSON):
    • 转换Python类型(strintfloatboollist等)
    • datetime对象
    • UUID对象
    • 数据库模型
    • 还有更多
  • 自动交互式API文档,包括2个替代用户界面:
    • 大摇大摆的UI
    • 复单

回到前面的代码示例,FastAPI将:

  • 验证是否存在item_id在用于的路径中GETPUT请求
  • 验证item_id类型为intGETPUT请求
    • 如果不是,客户端将看到一个有用的、明确的错误
  • 检查是否存在名为的可选查询参数q(如图所示http://127.0.0.1:8000/items/foo?q=somequery)用于GET请求
    • 作为q参数是用= None,它是可选的
    • 如果没有None这将是必需的(就像在具有以下情况的情况下的身体一样PUT)
  • PUT请求/items/{item_id},将正文读作JSON:
    • 检查它是否具有必需的属性name这应该是一个str
    • 检查它是否具有必需的属性price那一定是一个float
    • 检查它是否具有可选属性is_offer,那应该是一个bool,如果存在
    • 所有这些也适用于深度嵌套的JSON对象
  • 自动从JSON转换为JSON或自动转换为JSON
  • 使用OpenAPI记录可由以下人员使用的所有内容:
    • 交互式文档系统
    • 自动客户端代码生成系统,适用于多种语言
  • 直接提供2个交互式文档web界面

我们只是触及了皮毛,但您已经对它的工作原理有了大致的了解

尝试使用以下命令更改行:

    return {"item_name": item.name, "item_id": item_id}

出发地:

        ... "item_name": item.name ...

收件人:

        ... "item_price": item.price ...

并查看您的编辑器将如何自动完成属性并了解其类型:

有关包含更多功能的更完整示例,请参阅Tutorial – User Guide

剧透警报:教程-用户指南包括:

  • 的声明参数从其他不同的地方,如:标题曲奇饼表单域文件
  • 如何设置验证约束作为maximum_lengthregex
  • 一款功能非常强大且易于使用的依赖项注入系统
  • 安全性和身份验证,包括支持OAuth2使用JWT代币HTTP Basic身份验证
  • 更高级(但同样简单)的声明技术深度嵌套的JSON模型(多亏了皮丹蒂克)
  • 许多额外功能(感谢Starlette),如:
    • WebSockets
    • 图形QL
    • 极其简单的测试,基于requestspytest
    • CORS
    • Cookie会话
    • 还有更多

性能

独立TechEmpower基准显示FastAPI在Uvicorn AS下运行的应用程序one of the fastest Python frameworks available,仅低于Starlette和Uvicorn本身(由FastAPI内部使用)。(*)

要了解更多信息,请参阅小节Benchmarks

可选依赖项

由Pydtic使用:

由Starlette使用:

  • requests-如果要使用TestClient
  • aiofiles-如果要使用,则为必填项FileResponseStaticFiles
  • jinja2-如果要使用默认模板配置,则为必填项
  • python-multipart-如果您想支持表单“解析”,则为必填项,带有request.form()
  • itsdangerous-需要用于SessionMiddleware支持
  • pyyaml-Starlette的必填项SchemaGenerator支持(FastAPI可能不需要)
  • graphene-需要用于GraphQLApp支持
  • ujson-如果要使用,则为必填项UJSONResponse

由FastAPI/Starlette使用:

  • uvicorn-对于加载和服务您的应用程序的服务器
  • orjson-如果要使用,则为必填项ORJSONResponse

您可以使用以下命令安装所有这些组件pip install fastapi[all]

许可证

这个项目是根据麻省理工学院的许可条款授权的。