Может ли генератор подождать с выходом, пока не сработает другая функция? - PullRequest
0 голосов
/ 22 ноября 2018

Я написал следующий код тестирования для веб-сайта.Индекс показывает относительно пустую страницу, но он откроет поток, из которого он сможет получать больше сообщений от сервера, эффективно позволяя мне делать события на стороне сервера.Для этого мне нужно вставить генератор в объект Response.

from flask import Flask, Response, render_template

app = Flask(__name__)

def answer():
    while True:
        q = input("Whaddaya wanna say? ")
        yield 'data: {} \n\n'.format(q)

@app.route('/')
def index():
    return render_template('index.html')

@app.route('/stream')
def stream():
    return Response(answer(), mimetype="text/event-stream")

if __name__ == "__main__":
    app.run(threaded=True, debug=True)

Вместе с файлом с именем index.html это прекрасно работает.Я получаю любой текст, который я дал в качестве ввода для терминала.Однако, если второй пользователь посетит сервер, Python начнет переходить туда-сюда между двумя пользователями - некоторые входные данные будут отправлены одному пользователю, а следующий всегда будет отправлен другому.Я понимаю, что так оно и должно работать, но мне было интересно, можно ли создать генератор, который бы приносил доход всем клиентам.

В настоящее время я могу придумать два возможных способа сделать это.Первый не слишком сложный, но я не уверен, что это хорошая идея для практического применения.Здесь будет создан один экземпляр Messenger, после чего его функция ànswer() будет передана в качестве генератора.

class Messenger:
    def __init__(self):
        self.message = ""
    def send_msg(self,msg):
        self.message = msg

    def answer(self):
        current_message = self.message
        while True:
            # Yield when the message has been updated
            if self.message != current_message:
                current_message = self.message
                yield current_message

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

Я пробовал несколько методов, но я просто не могу придумать ни одного.Я не мог найти никакого решения в Интернете.Мое текущее предположение состоит в том, чтобы заставить функцию ждать, пока обновление не будет сделано.Что-то вроде следующего, хотя я не знаю, как закончить этот код.

class Messenger:
    def __init__(self):
        self.message = ""
    def send_msg(self,msg):
        self.message = msg

    def answer(self):
        while True:
            pass # Pause function until send_msg() is executed

            yield self.message

Возможно ли создать такую ​​функцию?Есть ли лучший способ решить эту проблему?Вместо этого вы бы рекомендовали поискать альтернативу генератору?Первый вариант не так плох, как кажется, и если да, то почему?

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