生成器可以等待屈服直到触发另一个功能吗?

时间:2018-11-22 07:42:54

标签: python function flask generator

我已经为网站编写了以下测试代码。索引显示了一个相对空白的页面,但是它将打开一个流,可以从该流中接收来自服务器的更多消息,从而有效地允许我进行服务器端事件。为此,我需要在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

是否可以创建这样的功能?有没有更好的方法来解决此问题?您是否会建议寻找替代发电机的替代方案?第一种选择不是看起来那么糟糕,如果是,为什么?

0 个答案:

没有答案