首页 > 编程语言 >SolidUI社区-Snakemq 通信源码分析

SolidUI社区-Snakemq 通信源码分析

时间:2023-08-01 17:08:04浏览次数:37  
标签:Snakemq logging snakemq connector 源码 link SolidUI import message

背景

随着文本生成图像的语言模型兴起,SolidUI想帮人们快速构建可视化工具,可视化内容包括2D,3D,3D场景,从而快速构三维数据演示场景。SolidUI 是一个创新的项目,旨在将自然语言处理(NLP)与计算机图形学相结合,实现文生图功能。通过构建自研的文生图语言模型,SolidUI 利用 RLHF (Reinforcement Learning Human Feedback) 流程实现从文本描述到图形生成的过程。

项目地址: https://github.com/CloudOrc/SolidUI

项目镜像地址: https://gitee.com/CloudOrc/SolidUI

Snakemq介绍

SnakeMQ是一个轻量级的消息队列(MQ)系统,主要用于在Python中实现异步任务队列和消息传递。

SolidUI 模型代理模块(soliduimodelui) 用到Snakemq , 涉及到内部通信时候,如果client 和server 不一一对应,通信就有问题,虽然日志不报错,但是不回返回结果,本文主要讲相关通信问题,为后续共建伙伴提供解决思路。

Snakemq作用

  • 轻量级和易于使用 - SnakeMQ使用纯Python编写,无任何外部依赖,可以很容易地在任何Python项目中集成使用。
  • 支持主流协议 - SnakeMQ实现了STOMP和AMQP等主流的MQ协议。
  • 多种消息模型 - 支持发布-订阅、工作队列、请求-响应等多种消息模型。
  • 持久化支持 - 支持将消息持久化到不同的后端,如Redis、MongoDB等。
  • 高性能 - SnakeMQ针对Python进行了优化,单机可以处理上万消息每秒。
  • 可扩展 - 可以水平扩展以实现集群,提高系统整体吞吐量。
  • 多语言支持 - 除了Python SDK,还提供了NodeJS、Java等语言的SDK。

SolidUI 中 soliduimodelui模块,是模型代理API,需要Web和 Kernel 通信用到Snakemq

Snakemq 测试代码

Snakemq client.py

import snakemq.link
import snakemq.packeter
import snakemq.messaging
import snakemq.rpc
import time
import json
import logging
logging.basicConfig(format="[%(asctime)s] %(levelname)s [%(name)s:%(lineno)s] %(message)s")
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.INFO)
logger.addHandler(console_handler)
logger.setLevel(logging.INFO)
fh = logging.FileHandler('app.log')
logger.addHandler(fh)
link = snakemq.link.Link()
packeter = snakemq.packeter.Packeter(link)
messaging = snakemq.messaging.Messaging("client", "", packeter)
connector = ("server", 8765)
link.add_connector(connector)
def on_connect(connector_id):
    logger.info(f"Connected to: {connector_id}")
link.on_connect.add(on_connect)
def on_disconnect(connector_id):
    logger.info(f"已断开: {connector_id}")
link.on_disconnect.add(on_disconnect)

def on_recv(conn, ident, message):
    logger.info(f"client接收到: {message.data}, 来自: {ident}")
messaging.on_message_recv.add(on_recv)
message = snakemq.message.Message(json.dumps({"type": "status", "value": "ready"}).encode("utf-8"), ttl=600)
messaging.send_message("server", message)
while True:
    link.loop()
    time.sleep(0.1)

Snakemq server.py

import snakemq.link
import snakemq.packeter
import snakemq.messaging
import snakemq.rpc
import time
import json
import logging
logging.basicConfig(format="[%(asctime)s] %(levelname)s [%(name)s:%(lineno)s] %(message)s")
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.INFO)
logger.addHandler(console_handler)
logger.setLevel(logging.INFO)
fh = logging.FileHandler('app.log')
logger.addHandler(fh)
link = snakemq.link.Link()
packeter = snakemq.packeter.Packeter(link)
messaging = snakemq.messaging.Messaging("server", "", packeter)
link.add_listener(("0.0.0.0", 8765))
def on_recv(conn, ident, message):
    logger.info(f"server接收到: {message.data}, 来自: {ident}")
messaging.on_message_recv.add(on_recv)

message = snakemq.message.Message(json.dumps( {"type": "execute", "value": "abc"}).encode("utf-8"), ttl=600)
messaging.send_message("client", message)
# Main loop
while True:
    link.loop()
    time.sleep(0.1)

Dockerfile

FROM python:3.8
WORKDIR /opt/snaketmq-test

RUN pip install snakemq
RUN python -c "import snakemq; print(snakemq.__file__); print(dir(snakemq))"
COPY . .

CMD ["python", "server.py"]

Dockerfile build & run

docker build -t snaketmq-test . 

docker network create mynet

docker run -d --name server --network mynet  snaketmq-test

docker run --network mynet  snaketmq-test python client.py

Snakemq通信

注意:Snakemq 测试代码,因为容器内通信,ip addr 会涉及到多个ip ,虽然容器设置网段mynet ,但是 server link.add_listener(("0.0.0.0", 8765)) 这行代码

  • server: 表示SnakeMQ的服务器实例。

  • link: server中的link属性,表示网络连接管理器。

  • add_listener: 向link中添加一个监听器。

  • ("0.0.0.0", 8765): 监听的地址和端口。"0.0.0.0"表示监听所有网卡地址,"8765"表示监听8765端口。 client connector = ("server", 8765) link.add_connector(connector) 这行代码

  • connector = ("server", 8765) : 创建一个元组connector,里面包含了SnakeMQ服务器的地址"server"和端口8765。

  • link.add_connector(connector): 调用link对象(这里应该是SnakeMQ的连接对象)的add_connector方法,传入参数connector,将上一步创建的连接信息添加到连接对象中。

  • 综合来看,这行代码的作用就是创建一个连接元组,包含SnakeMQ服务器的地址和端口,然后将这个连接信息添加到SnakeMQ的连接对象中,以建立SnakeMQ的客户端连接。

结语

本文通过Snakemq 案例 来解释SolidUI 内部通信,让大家明白配置地址时候ip 为什么这样设置,目的是为了一一对应,不是盲目设置localhost就能解决,为大家后续更好共建SolidUI提供思路。

如果成为贡献者

  • 官方文档贡献。发现文档的不足、优化文档,持续更新文档等方式参与社区贡献。通过文档贡献,让开发者熟悉如何提交PR和真正参与到社区的建设。参考攻略:https://github.com/CloudOrc/SolidUI/discussions/54
  • 代码贡献。我们梳理了社区中简单并且容易入门的的任务,非常适合新人做代码贡献。请查阅新手任务列表:https://github.com/CloudOrc/SolidUI/issues/12
  • 内容贡献:发布SolidUI开源组件相关的内容,包括但不限于安装部署教程、使用经验、案例实践等,形式不限,请投稿给小助手。例如:https://github.com/CloudOrc/SolidUI/issues/10
  • 社区答疑:积极在社区中进行答疑、分享技术、帮助开发者解决问题等; 其他:积极参与社区活动、成为社区志愿者、帮助社区宣传、为社区发展提供有效建议等;

标签:Snakemq,logging,snakemq,connector,源码,link,SolidUI,import,message
From: https://blog.51cto.com/u_15349018/6924345

相关文章

  • 低代码PAAS平台源码,采用对象式和勾选式实现企业应用程序开发
    管理后台低代码PaaS平台是一款基于SalesforcePlatform的开源替代方案,旨在为企业提供高效、灵活、易于使用的低代码开发平台。低代码PaaS平台的10大核心引擎功能:1.建模引擎2.移动引擎3.流程引擎4.页面引擎5.报表引擎6.安全引擎7.API引擎8.应用集成引擎9.代码引擎10.公......
  • 不断创新短视频APP源码,未来可期!
    2018年短视频平台的爆火席卷了大江南北,不少商家和互联网都卷入其中,研究发开自己的短视频APP,而短视频源码最早是基于Adobe/FlashMediaServer开发的一款CMS系统,当然目前已经开始逐步通过第三方云服务代替了FMS。首先在源码功能上,包含了录制拍摄、编辑、合成三个部分,其中还涉及到了......
  • RTSP流媒体服务器LntonNVR(源码版)平台硬件设备拔电关闭后不能自动重启的问题解决方案
    LntonNVR视频边缘计算网关可以放置在项目现场,7x24小时不间断使用,通电联网即可成功运行,部署操作十分简单。我们在测试时,将LntonNVR注册到服务启动,拔掉硬件设备的电源后,再次恢复供电,发现LntonNVR服务并没有再次启动。对此我们也进行了分析与排查。排查步骤如下:1、首先检查是否已经......
  • 科技驱动医疗创新:智慧医院与在线药房系统源码开发解析
    时下,智慧医院和在线药房系统作为医疗创新的代表,为患者和医务人员提供了更加高效、便捷的医疗服务。本文将深入探讨智慧医院与在线药房系统的关键特点,以及源码开发的重要性,旨在带领读者了解这些创新技术对医疗行业的深远影响。 一、智慧医院的特点与优势优化医疗资源的分配与利用,提......
  • 国标GB28181视频平台LntonGBS(源码版)国标平台出现报错“缺失dll文件”的问题解决方案
    LntonGBS是基于国标GB28181协议的视频云服务平台,它可以支持国标协议的设备接入,在视频能力上能实现直播、录像存储、检索与回放、云台控制、告警上报、语音对讲、平台级联等功能,既能作为业务平台使用,也能作为能力层平台调用。技术人员在用户服务器部署LntonGBS平台,提示缺失某个dll文......
  • Ubuntu16 编译源码出错 unsupported reloc 43
      错误如下prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.11-4.6//x86_64-linux/include/c++/4.6/bits/basic_string.h:270:error:unsupportedreloc43prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.11-4.6//x86_64-linux/include/c++/4.6/bits/basic_string.h:270......
  • 国标GB28181视频平台LntonGBS(源码版)国标视频平台大屏播放时出现数据未推送的问题解决
    LntonGBS平台实现视频直播、转码与分发、平台级联、云台控制等,拥有灵活丰富的视频能力。平台基于云边端一体化架构,在很多场景中均有落地项目应用,如智慧工地、智慧安防、智慧工厂、智慧园区等。近期有用户反馈其定制版LntonGBS平台现场播放24路上大屏时有部分通道存在30秒左右出现未......
  • 直播带货源码,什么是cross field validation(交叉验证)
    直播带货源码,什么是crossfieldvalidation(交叉验证)解释crossfield可以理解为跨字段,跨字段就是这个字段的校验依赖于另外一个字段(我的理解),比如 publicclassMyBean{ privatebooleanselected; privateStringsomeString; ...}​ 以上就是直播带货源码,什么是cr......
  • 视频直播网站源码,前端效果-css+javascript
    视频直播网站源码,前端效果-css+javascript <!DOCTYPEhtml><html><head>  <metacharset="UTF-8">  <metahttp-equiv="X-UA-Compatible"content="IE=edge">  <metaname="viewport"content="w......
  • 在线直播系统源码,vant 轮播图组件
    在线直播系统源码,vant轮播图组件 <template> <van-swipe:autoplay="3000"indicator-color="#1baeae">  <van-swipe-itemv-for="(item,index)inlist":key="index">   <img:src="item.carouselUrl"......