gx19860411 发表于 2022-9-23 21:23

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

就是内网用户的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)

chachi 发表于 2022-9-23 22:28

本帖最后由 chachi 于 2022-9-23 22:31 编辑

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

gx19860411 发表于 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可能都够了

5long 发表于 2022-9-24 00:06

消息队列这种架构一下子就多了至少一个服务
消费者如果还要单独启动一个进程,又多了一个要维护的地方
感觉对 LZ 这样的初学者不算太友好

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

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

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

chaucerling 发表于 2022-9-24 00:22

这需求socket就可以实现了

忘归然 发表于 2022-9-24 01:31

回传时间也是个问题,超过1秒的任务还是用ws吧

—— 来自 S1Fun

chachi 发表于 2022-9-24 02:17

本帖最后由 chachi 于 2022-9-24 02:19 编辑

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

nessaj 发表于 2022-9-24 07:08

kinta 发表于 2022-9-24 13:43

我不是码农这种我会用Redis当消息队列,生产者把结果lpush进去,消费者定时去rpop

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

kinta 发表于 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
页: [1]
查看完整版本: 求教python局域网内通信的实现