创建分布式asgi应用程序,从中心redis队列中提取事件。

distributed-asgi的Python项目详细描述


分布式asgi

使用redis在基于路由的工作asgi应用程序之间分发asgi消息。工人可以在不同的机器上,他们只需要能够连接到中央redis服务器。

用法

路由由两部分组成:匹配路径的正则表达式和用于形成asgi事件被推送到的键的键模板字符串。

密钥模板也可以使用带编号的regex反斜杠替换。例如,路由{"/api/([a-z-]+)":r"API-\1"}将匹配并生成以下密钥:

PATH                KEY
/api/test           API-test
/api/test/38        API-test
/api/banana         API-banana
/test/api/test2     API-test2

下面是一个示例:

# distributor.pyfromdistributed_asgiimportcreate_path_distributorapp=create_path_distributor(host="mywebsite.com",# point to redis serverport=6379,db=0,password="abc123",routes={"/api/([a-z-]+)":r"ASGI-\1","/worker/([0-9]+)":r"worker-queue-\1","/":"ALL-WEBSITE-TRAFFIC"})

要真正利用这一点,我们需要让一个工人监听一个或多个键

# worker.pyfromdistributed_asgiimportNodeclassASGIApp:def__init__(self,scope):self.scope=scopeasyncdef__call__(self,receive,send):awaitsend({"type":"http.response.start","status":200})awaitsend({"type":"http.response.body","body":b"Hello World!"})node=Node(host="mywebsite.com",port="6379",password="abc123",cls=ASGIApp,key='ASGI-testing')print(f"Starting worker")node.run()

一旦你有了worker.pyserver.py,使用一些接口服务器来运行distributor.py

$ uvicorn server:App

作为一个普通的python脚本运行worker.py

$ python worker.py

工作进程将只使用包含/api/testing的路径响应http请求,因为这是我们告诉它要侦听的唯一密钥。

如果没有工人怎么办?

如果没有节点实例监听分发服务器将事件推送到的密钥,则分发服务器将在5秒后超时,关闭连接,并返回405错误。worker不需要在5秒内响应,node类会自动让分发服务器知道至少有一个worker在监听。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java Android使用两个后台服务错误   解压缩HTTPInputStream时,java GZIPInputStream过早关闭   javax和javax的区别是什么。网ssl。密钥库和服务器。ssl。为SpringBoot应用程序指定密钥库时的密钥库属性   java生成两个JPanel,而我只需要一个   java深度链接从play store安装应用程序时获取数据   java 安卓应用程序在退出时未正确释放蓝牙   java正确使用setCellValueFactory   java开放JdbcTemplate连接处于只读模式?   使用Spring MVC创建服务时发生java错误   JavaFX获取安装在计算机中的特定应用程序的版本   SecureRandom的安全问题:PRNG在java 1.5中不一致   windows我可以创建一个独立的。带Inno设置的Java应用程序的exe安装程序?   如何使用JavaServlet下载csv文件?   java从生成的缓冲图像中添加图像作为jasper中的数据记录?   java日期和时间解析