Stage1st

 找回密码
 立即注册
搜索
查看: 1167|回复: 12

[网络] 求教python局域网内通信的实现

[复制链接]
     
发表于 2022-9-23 21:23 来自手机 | 显示全部楼层 |阅读模式
就是内网用户的py程序给服务器正在运行的py程序发信息,然后服务器根据信息处理过后把结果传回用户的py程序。还有个排队问题,服务器那程序一次只能处理一个信息。
其中还有个问题 要服务器知道不同用户的 开始 结束 等待状态 ,以及让用户知道自己的请求是否在等待还是正在处理或结束,这个该怎么获取呢?
完全不知道怎么实现,求指导。
回复

使用道具 举报

     
发表于 2022-9-23 21:32 | 显示全部楼层
用flask整一套rest api试试?
状态可以存后端数据库里
回复

使用道具 举报

     
发表于 2022-9-23 21:44 来自手机 | 显示全部楼层
像楼上说的上个rest api
调用方把信息放到里请求体里,post /submit_job,服务器把请求加入内存队列,返回一个任务ID(可以简单递增,也可以UUID),后续调用方想查询任务状态,可以定时带上任务ID get /status,服务端根据任务ID返回结果(已完成)或者队列顺序(排队中)
如果想让把完成状态直接push到调用方,可以在请求体里包含个回调URL(Web hook),服务端完成任务后请求这个回调URL通知调用方
或者直接用消息队列,调用方作为producer,服务端作为consumer,走消息队列自己的机制查询排队状态(例如是否ACK)
回复

使用道具 举报

     
发表于 2022-9-23 22:28 | 显示全部楼层
本帖最后由 chachi 于 2022-9-23 22:31 编辑

用mq不是正好,两个队列,互为生产者和消费者
一个作业队列
一个结果队列

回复

使用道具 举报

     
 楼主| 发表于 2022-9-23 22:43 来自手机 | 显示全部楼层
chachi 发表于 2022-9-23 22:28
用mq不是正好,两个队列,互为生产者和消费者
一个作业队列
一个结果队列

mq是啥?求个全称

—— 来自 Xiaomi M2011K2C, Android 12上的 S1Next-鹅版 v2.5.4
回复

使用道具 举报

     
发表于 2022-9-23 23:27 来自手机 | 显示全部楼层
gx19860411 发表于 2022-9-23 22:43
mq是啥?求个全称

—— 来自 Xiaomi M2011K2C, Android 12上的 S1Next-鹅版 v2.5.4

message queue,消息队列
你这个场景比较简单的rabbitmq可能都够了
回复

使用道具 举报

     
发表于 2022-9-24 00:06 | 显示全部楼层
消息队列这种架构一下子就多了至少一个服务
消费者如果还要单独启动一个进程,又多了一个要维护的地方
感觉对 LZ 这样的初学者不算太友好

想问下客户端对用户体验要求高吗?
比如说,下面这种最粗糙的实现,客户端能接受吗?
如果能,那么就先从这种简单的做法上手:

服务端用 HTTP 框架(比如 Flask),先不需具备并发处理能力
每次有客户端的请求进来,就去做 LZ 所说的“一次只能处理一个信息”,等处理完成之后再向客户端返回响应
处理过程中,有新的请求进来,会因为无法建立 TCP 连接而超时

这样如果能满足,那可以先上线
等积累了一点基础
再开始研究如何在服务器端保存 / 修改任务执行的状态
这一步也可以先用个 SQLite 数据库凑合着
没必要一上来就搞消息队列
回复

使用道具 举报

发表于 2022-9-24 00:22 | 显示全部楼层
这需求socket就可以实现了
回复

使用道具 举报

     
发表于 2022-9-24 01:31 | 显示全部楼层
回传时间也是个问题,超过1秒的任务还是用ws吧

—— 来自 S1Fun
回复

使用道具 举报

     
发表于 2022-9-24 02:17 | 显示全部楼层
本帖最后由 chachi 于 2022-9-24 02:19 编辑

现成的MQ不去用,自己去造一个类似MQ的功能。。
注意需求是有服务端一次只能处理一个请求的要求,多余的请求必须服务端要有队列来维护
而且也不知道服务器端多久执行完请求,你一个socket上去还要考虑超时重连断线结果ACK等等
初期选型不选好必然导致后期推倒重做
回复

使用道具 举报

     
发表于 2022-9-24 07:08 | 显示全部楼层
python-socketio

—— 来自 S1Fun
回复

使用道具 举报

     
发表于 2022-9-24 13:43 来自手机 | 显示全部楼层
我不是码农这种我会用Redis当消息队列,生产者把结果lpush进去,消费者定时去rpop

—— 来自 samsung SM-G9910, Android 12上的 S1Next-鹅版 v2.5.4
回复

使用道具 举报

     
发表于 2022-9-24 13:49 来自手机 | 显示全部楼层
import redis json
conn_pool = redis.ConnectionPool(host='x.x.x.x', port=6379)
    # 队列名称
q_name="xxx"
re_queue = redis.Redis(connection_pool=conn_pool)
for data in datas:
        #从左往右推入数据
                          re_queue.lpush(q_name,json.dumps(data)


消费者一个用rpop从右往左从队列里拿数据,


—— 来自 samsung SM-G9910, Android 12上的 S1Next-鹅版 v2.5.4
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|上海互联网违法和不良信息举报中心|网上有害信息举报专区|962110 反电信诈骗|举报电话 021-62035905|stage1st 沪ICP备13020230号-1 沪公网安备 31010702004909号

GMT+8, 2022-9-26 20:47 , Processed in 0.046358 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表