我拥有的
我在Flask中有一个客户端/服务器。客户端将JSON格式的查询发送到服务器,并且服务器创建JSON文件。还有另一个工具可以接受此查询,在数据库上执行该查询,然后将结果写入results.txt文件。服务器会定期检查“结果”目录中的.txt文件,如果找到新文件,它将提取结果。对于定期检查,我使用了APS。
我想做什么 现在,我要将服务器从.txt文件中提取的数据(queryResult)发送回客户端。
这是我到目前为止所做的。
"cy" : yScale
let groups = svg.selectAll("g") .data(dataset) .enter() .append("g") groups.append("title") .text(d => d.country) groups .append("path").classed("line", true) .attr("d", d => line(d.emissions)) .style("stroke-width", d => d.country === "China" ? 1 : 0.2 ) let circle = groups.selectAll("circle") .data(d => d.emissions) .enter() .append("circle"); circle.attrs({ "cx": d => xScale(d.year), "cy": d => yScale(d.amount), "r" : 3 }) .style("opacity", 0) circle.on("mouseover", () => d3.select(this) .call(mouseOverFunc)); const mouseOverFunc = selection => selection .transition() .duration(10) .style("opacity", 1) .style("fill", "turquoise") .attr("r", 3)
有人可以帮助我如何将此queryResult发送回客户端吗?
编辑:我希望服务器每次在Tool目录中遇到新文件时都将queryResult发送回客户端,即,每次找到新文件时,它将提取结果(当前正在执行)并将其发送回客户端。
答案 0 :(得分:0)
您要执行的操作称为Web Worker Architecture
。
要将实时摘要queryResult
从后台作业传递到客户端应用程序,可以使用消息队列(建议使用Kafka,RabbitMQ也可以)和Web套接字的组合。当客户端向/data
端点发送请求时,您应该返回一些唯一的令牌(例如,如果您的用户是匿名用户,则为UUID;如果已通过身份验证,则为用户ID)。您应该在结果文件的名称中添加相同的标记。当后台工作人员完成文件处理后,它将使用令牌(来自文件名)来创建Kafka或RabbitMQ主题(例如topic_for_user_id_1337
或topic_for_uuid_jqwfoj-123qwr
),并将queryResult
作为消息发布。
与此同时,您的客户端应建立Web套接字连接(Flask对于Web套接字而言是相当糟糕的,但是无论如何,都很少有很好的库,例如socketio),并将令牌通过它传递给后端因此它将创建一个消息队列订阅者,并使用令牌的名称订阅一个主题,以便在后台作业完成时,Web后端将接收到一条消息并将其通过Web套接字传递给用户。
P.S。如果听起来过于复杂,则可以避免使用MQ和WS,并将queryResult
放入数据库中,并创建一个端点来检查它是否存在于数据库中。如果没有,则返回not ready yet
之类的内容,如果准备就绪,客户端将在几秒钟后重试-您从数据库返回了queryResult
。