Как отправить обработанные данные клиенту с помощью другого скрипта Python — Python Flask

У меня есть скрипт (сервер) Python с именем main.py, который принимает запросы клиентов и добавляет данные в очередь. Есть несколько рабочих потоков Python, которые проверяют эту очередь. Если worker свободен и очередь не пуста, worker берет элемент из очереди, обрабатывает и отправляет ответ обратно клиенту. Клиенты должны ждать, пока рабочий выполнит задачу. Как я могу сделать это в питоне? В основном, как я могу определить, какому клиенту я должен отправить данные обратно. Что мы обычно делаем, так это возвращаем значение из функции 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. Я их еще не создал.


person Thamindu DJ    schedule 07.04.2019    source источник
comment
есть 3 способа, о которых я могу думать. 1) запись на диск и чтение с диска, но при неправильном управлении это может вызвать состояние гонки. 2) с использованием очереди внешней программы, такой как rabbitmq, что хорошо, если вам нужна надежность в случае сбоя ваших скриптов, но требует некоторой настройки и может быть непростым в отладке. 3) используя multiprocessing.Pipe проверьте этот ответ stackoverflow.com/a/43861226/1310093   -  person Ta946    schedule 07.04.2019
comment
Это не моя проблема. Моя проблема в том, как я могу получить URL-адрес клиента или что-то в этом роде, используя флягу. Потому что я должен отправить данные позже. Я не могу вернуть их сразу. Я также отредактировал вопрос.   -  person Thamindu DJ    schedule 07.04.2019


Ответы (1)


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

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

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

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

person Ryan Marvin    schedule 07.04.2019
comment
Второй способ вроде нормальный. Спасибо - person Thamindu DJ; 08.04.2019