当前位置: 首页 > 面试题库 >

使用Flask在Python中进行长轮询

督烨赫
2023-03-14
问题内容

我正在尝试在Flask框架下使用JQuery和Python进行长时间轮询。

在PHP中进行了长时间的轮询之后,我尝试以相同的方式进行处理:

具有while(true)循环的脚本/函数,定期检查更改,例如,数据库中每0.5秒更改一次,并在发生更改时返回一些数据。

因此,在我的ini .py文件中,我创建了一个到/ poll的app.route,以供JQuery调用。jQuery向其提供有关客户端当前状态的一些信息,并且poll()函数将其与数据库中当前的状态进行比较。当观察到更改时,循环结束并返回信息。

这是python代码:

@app.route('/poll')
def poll():
client_state = request.args.get("state")

    #remove html encoding + whitesapce from client state
    html_parser = HTMLParser.HTMLParser()
    client_state = html_parser.unescape(client_state)
    client_state = "".join(client_state.split())

    #poll the database
    while True:
        time.sleep(0.5)
        data = get_data()
        json_state = to_json(data)
        json_state = "".join(data) #remove whitespace

        if json_state != client_state:
            return "CHANGE"

问题是,当上面的代码开始轮询时,服务器似乎过载,并且其他Ajax调用以及其他请求(例如,使用JQuery将“加载”图像加载到html)均无响应且超时。

为了完整起见,我在此处包括了JQuery:

function poll() {

queryString = "state="+JSON.stringify(currentState);

$.ajax({
    url:"/poll",
    data: queryString,
    timeout: 60000,
    success: function(data) {
        console.log(data);
        if(currentState == null) {
            currentState = JSON.parse(data);
        }
        else {
            console.log("A change has occurred");
        }

        poll();

    },
    error: function(jqXHR, textStatus, errorThrown) {

        console.log(jqXHR.status + "," + textStatus + ", " + errorThrown);

        poll();

    }
});

}

是否需要多线程?还是有人知道为什么我会遇到这种现象?


问题答案:

flask应用程序只是重载。这是因为在运行时app.run(),flask应用默认情况下处于单线程模式,因此每次只能处理一个请求。

你可以使用以下方法启动多线程:

if __name__ == '__main__':
    app.run(threaded=True)

或使用诸如gunicorn或uwsgi之类的WSGI服务器为烧瓶进行多重处理:

gunicorn -w 4 myapp:app

希望你喜欢使用Python和Flask!



 类似资料:
  • 问题内容: 正在寻找一种简单的方法(即,不需要我设置单独的服务器来处理消息队列的方法)来对运行计算并生成图形的小型Web界面进行长轮询。这是我的网络界面需要执行的操作: 用户在Web界面中请求图形/数据 服务器运行一些计算。 当服务器运行计算时,将随计算进度更新一个小容器(可能通过AJAX / jQuery)(类似于您在使用consol进行打印时所做的操作(即打印“计算密度函数…”)) 计算完成并

  • 问题内容: 我们尝试在我们公司的ERP中实施基于长期轮询的通知服务。与Facebook通知类似。 使用的技术: 在每次循环迭代中,PHP 设置为60秒零1秒。 jQuery用于AJAX处理。 Apache作为Web服务器。 经过近一个月的编码,我们开始生产。部署后几分钟,我们不得不回滚所有内容。事实证明,我们的服务器(8个核心)无法处理20名员工的长时间请求,每个服务器都使用约5个浏览器标签。例如

  • 问题内容: 如何在不牺牲缩进的情况下在Python中换行? 例如: 假设该值超过了建议的79个字符的限制。我的阅读方式如下: 但是,使用这种方法,实线的缩进与的缩进匹配。这看起来有点丑陋。如果有人要遍历我的代码,则由于该语句而导致缩进不均匀看起来很糟糕。 如何在不牺牲代码可读性的情况下有效缩进这样的行? 问题答案: def fun(): print((‘{0} Here is a really l

  • 我是一个新手,但我真的很喜欢长轮询的想法。 在阅读了它之后,我会这样实现它: 客户端请求服务器(AJAX) 服务器正在轮询DB以获取更改 识别更改时或服务器响应超时后 我的问题是,对于每一个请求,都在服务器上启动一个线程,并且每个线程都轮询DB。 在服务器上运行一个接受所有传入请求的线程不是更有效吗?例如: 客户端请求服务器(AJAX) 服务器将请求添加到队列(无响应) 辅助线程轮询数据库以获取与

  • 问题内容: 我正在尝试学习python,mongodb和flask,并使用了Miguel Grinberg的VERY EXCELLENT博客,他在blog.miguelgrinberg.com上提供了很多教程 我有一个小型的RESTful服务器,可以正常工作,但现在想从mongo而不是mysql中提取内容 我可以使用下面的代码提取一条mongo记录,但正在努力使其呈现。 我在下面的代码中使用箭头来

  • 问题内容: 对于需要快速刷新数据的应用程序,使用JavaScript轮询服务器的最佳实践是什么?我将jQuery用于前端,将Java Spring Framework用于后端。 刷新数据的示例可以是很快(每1秒)更新一次的项目列表。 问题答案: 您可能想使用jQuery的Ajax函数每秒钟左右轮询一次服务器。然后,服务器可以近乎实时地向浏览器发出指令响应。 您也可以考虑使用长轮询而不是上面的方法,