У меня есть скрипт (сервер) на языке 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
. Я их еще не создал.