如何使用另一个python脚本将处理过的数据发送到客户端 - Python Flask

问题描述 投票:-1回答:1

我有一个名为main.py的python脚本(服务器),它接受客户端请求并将数据添加到队列中。有很少的python工作线程正在检查该队列。如果worker是空闲的并且队列不为空,则worker从队列中获取一个元素,处理并将响应发送回客户端。客户端应该等到工作人员执行任务。我怎么能在python中这样做?基本上我如何识别应该发回数据的客户端。我们通常使用main.pyflask.jsonify()的serve函数返回值。但我不能在这里做,因为处理可能会在以后线程空闲时发生。

工作线程在另一个python脚本中。说worker.py

这是我的main.py

from queue import Queue
import flask
import threading

# initialize flask application
app = flask.Flask(__name__)

## Creating pools
workers = Queue(10)
tasks = Queue(10)

taskLock = threading.Lock()

@app.route('/predict', methods=["POST"])
def serve():
    if flask.request.method == "POST":
        if flask.request.files.get('image'):
            tasks.put(flask.request.files["image"].read())

            ??

            return flask.jsonify(("wait..."))




if __name__ == "__main__":
    print("Server is running...")
    app.run(host='0.0.0.0')

worker.py代码

class predictThread(threading.Thread):
    def __init__(self, threadID, name, que, lock):
        threading.Thread.__init__(self)
        self.threadID  =threadID
        self.name = name
        self.que = que
        self.lock = lock

    def run(self):
        print("starting " + self.name + " thread")
        work(self.que, self.lock)
        print("Exiting " + self.name + " thread")


def work(que, lock):
    while True:
        if que.empty():
            time.sleep(2)
        else:
            lock.acquire()
            data = que.get()
            lock.release()
            # process data

假设工作线程在main.py的工作队列中运行。我还没有创建它们。

python multithreading flask client-server
1个回答
1
投票

你在这里有一个异步处理模型。你收到一些工作并在以后处理。由于客户端 - 服务器通信是同步的,因此您有以下几种选择:

  1. 保持HTTP连接:服务器通常具有设置的超时值,例如5/10/15秒,因此您可以做的是让客户端保持连接活动的时间长于此默认超时,直到您完成运行作业并返回响应为止。需要注意的是,响应时间取决于您队列中的作业数量,可能是在您到达请求中指定的作业之前的几分钟/小时,该作业将在队列的末尾但是有方法解决这个问题,例如每个请求只有一名工人。 (HTTP Persistent Connection
  2. 您也可以向客户端发回202 ACCEPTED响应,以显示该作业已被接受处理,并让客户端轮询服务器以获取该作业的状态。

如果您的客户端是浏览器,您可以查看Comet web application model,其中包含针对此问题的不同方法。

© www.soinside.com 2019 - 2024. All rights reserved.