如何使用另一个 python 脚本将处理后的数据发送到客户端 - Python Flask
How to send processed data to a client using another python script - Python Flask
我有一个名为 main.py
的 python 脚本(服务器),它接受客户端请求并将数据添加到队列中。很少 python 个工作线程正在检查该队列。如果 worker 空闲且队列不为空,则 worker 从队列中取出一个元素,处理并将响应发送回客户端。客户应该等到工作人员执行任务。我如何在 python 中执行此操作? 基本上我如何确定我应该将数据发送回哪个客户端。我们通常做的是 return 使用 flask.jsonify()
来自 main.py
服务函数的值。但是我不能在这里做,因为处理可能会在线程空闲时发生。
工作线程在另一个 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 秒,所以您可以做的是让客户端保持连接的时间超过此默认超时时间,直到您已完成 运行 作业和 return 响应。这里需要注意的是,响应时间取决于您队列中的作业数量,在您到达请求中指定的作业之前它可能是 minutes/hours,该作业将位于队列的末尾,但是有一些方法可以解决这个问题,例如每个请求只有一个工人。 (HTTP Persistent Connection)
您也可以向客户端发回 202 ACCEPTED 响应,以表明该作业已被接受进行处理,并让客户端轮询服务器以了解该作业的状态。
如果您的客户端是浏览器,您可以查看 Comet web application model,其中包含解决此问题的不同方法。
我有一个名为 main.py
的 python 脚本(服务器),它接受客户端请求并将数据添加到队列中。很少 python 个工作线程正在检查该队列。如果 worker 空闲且队列不为空,则 worker 从队列中取出一个元素,处理并将响应发送回客户端。客户应该等到工作人员执行任务。我如何在 python 中执行此操作? 基本上我如何确定我应该将数据发送回哪个客户端。我们通常做的是 return 使用 flask.jsonify()
来自 main.py
服务函数的值。但是我不能在这里做,因为处理可能会在线程空闲时发生。
工作线程在另一个 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 秒,所以您可以做的是让客户端保持连接的时间超过此默认超时时间,直到您已完成 运行 作业和 return 响应。这里需要注意的是,响应时间取决于您队列中的作业数量,在您到达请求中指定的作业之前它可能是 minutes/hours,该作业将位于队列的末尾,但是有一些方法可以解决这个问题,例如每个请求只有一个工人。 (HTTP Persistent Connection)
您也可以向客户端发回 202 ACCEPTED 响应,以表明该作业已被接受进行处理,并让客户端轮询服务器以了解该作业的状态。
如果您的客户端是浏览器,您可以查看 Comet web application model,其中包含解决此问题的不同方法。