创建分布式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出现编译错误,我不理解   java在gnu-trove库中是否有任何有序映射?   java Servlet应该有映射,但找不到Servlet   java时间和第二期显示1:10,而不是13:10   java Play Framework 1.2.7 Heroku更新崩溃   线程“main”java中的opencsv异常。lang.NoClassDefFoundError:org/apache/commons/lang3/ObjectUtils   selenium在java中隐藏警告消息   java使用ID引用将JSON实体反序列化为POJO   java无法在JRE 8中加载字体   一个线程中的异常/错误会使整个应用程序停止吗?   java访问重复子规则的元素标签;e、 g.用ANTLR解析(1,2,3)中的a   java如何从平移旋转中找到新坐标   使用HTML Java小程序托管jar文件存在安全问题   java如何按频率而不是字母顺序排列字符串数组   java清除bufferedReader和块以获得更多输入   java解密SAML2断言