Как отправить обработанные данные клиенту, используя другой скрипт на Python - Python Flask - PullRequest
0 голосов
/ 07 апреля 2019

У меня есть скрипт (сервер) на языке Python main.py, который принимает запросы клиентов и добавляет данные в очередь. Есть несколько рабочих потоков Python, которые проверяют эту очередь. Если работник свободен, а очередь не пуста, работник берет элемент из очереди, обрабатывает и отправляет ответ клиенту. Клиенты должны ждать, пока работник выполнит задачу. Как я могу сделать это в Python? В основном, как я могу определить, какому клиенту я должен отправить данные обратно. Обычно мы возвращаем значение из функции serve в main.py, используя flask.jsonify(). Но я не могу сделать это здесь, потому что обработка может произойти в более позднее время, когда потоки свободны.

Рабочие потоки находятся в другом скрипте 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. Я их еще не создал.

1 Ответ

1 голос
/ 07 апреля 2019

Здесь у вас есть модель асинхронной обработки.Вы получаете какую-то работу и обрабатываете ее позже.Поскольку связь клиент-сервер является синхронной, у вас есть несколько вариантов:

  1. Сохранять соединение HTTP: серверы часто будут иметь установленное значение времени ожидания, например 5/10/15 секунд, так что выможно было бы сделать так, чтобы клиент поддерживал соединение дольше, чем этот таймаут по умолчанию, пока вы не закончили выполнение задания и не вернули ответ.Предостережение заключается в том, что время отклика зависит от количества заданий, которые у вас есть в вашей очереди, и может пройти несколько минут / часов, прежде чем вы перейдете к заданию, указанному в запросе, которое будет находиться в конце очереди, но есть способычтобы обойти это, например, имея одного работника на запрос.( Постоянное соединение HTTP )

  2. В качестве альтернативы вы можете отправить ответ 202 ACCEPTED клиенту, чтобы показать, что задание было принято для обработки и проведено опрос клиентов.сервер для статуса этой работы.

Если ваш клиент - браузер, вы можете взглянуть на модель веб-приложения Comet , которая включает в себя различные подходы дляэта проблема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...