如何使用另一个python脚本(python Flask)将处理后的数据发送到客户端

如何使用另一个python脚本(python Flask)将处理后的数据发送到客户端,python,multithreading,flask,client-server,Python,Multithreading,Flask,Client Server,我有一个名为main.py的python脚本(服务器),它接受客户机请求并向队列添加数据。很少有python工作线程检查该队列。若worker是空闲的,并且队列不是空的,那个么worker从队列中获取一个元素,处理并将响应发送回客户端。客户端应等待工作人员执行任务。如何在python中实现这一点基本上,我如何确定应该将数据发送回哪个客户端。我们通常使用flask.jsonify()在main.py处从serve函数返回值。但我不能在这里执行此操作,因为处理可能会在线程空闲时发生。 工作线程在另一

我有一个名为
main.py
的python脚本(服务器),它接受客户机请求并向队列添加数据。很少有python工作线程检查该队列。若worker是空闲的,并且队列不是空的,那个么worker从队列中获取一个元素,处理并将响应发送回客户端。客户端应等待工作人员执行任务。如何在python中实现这一点基本上,我如何确定应该将数据发送回哪个客户端。我们通常使用
flask.jsonify()
main.py
处从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
中的工作队列中运行。我还没有创建它们。

这里提供的是一个异步处理模型。你会收到一些工作,然后再处理。由于客户机-服务器通信是同步的,因此您有几个选项:

  • 保持HTTP连接:服务器通常会有一个设置的超时值,例如5/10/15秒,因此您可以让客户端保持连接的活动时间超过此默认超时时间,直到您完成作业并返回响应为止。这里需要注意的是,响应时间取决于您队列中的作业数量,在到达请求中指定的作业之前可能需要几分钟/小时,该作业将位于队列的末尾,但有一些方法可以绕过这一点,例如,每个请求有一个工作人员。()

  • 您也可以将202 ACCEPTED响应发送回客户端,以显示作业已被接受进行处理,并让客户端轮询服务器以了解该作业的状态


  • 如果您的客户端是浏览器,您可以查看包含解决此问题的不同方法的。

    我可以想出三种方法。1) 写入磁盘和从磁盘读取,但如果管理不当,可能会导致争用情况。2) 使用像rabbitmq这样的外部程序队列,如果您在脚本崩溃时需要可靠性,这是很好的,但是需要一些设置,并且可能不容易调试。3) 使用多处理。管道检查这个答案,这不是我的问题。我的问题是如何使用flask获取客户端url或类似的内容。因为我以后必须发送数据。我不能马上归还。我也编辑了这个问题。第二种方法似乎还可以。非常感谢。