gpt4 book ai didi

android - Python 多线程服务器和与 Android 客户端的异步 websocket 通信

转载 作者:行者123 更新时间:2023-11-30 05:04:43 25 4
gpt4 key购买 nike

我有一个 Android 客户端应用程序,它使用 Python 将一些数据发送到服务器,其中 Python 服务器应该运行长时间耗时的操作/计算并将结果返回给客户端。

为此,我最初开始在服务器端使用 Flask 和 Python,并使用 asynchronous android http library在客户端通过 http POST 发送数据。然而,我很快注意到这不是要走的路,因为服务器上的计算需要时间,这会导致客户端出现超时错误等问题。

然后,我开始使用 Tornado's Websockets在服务器端,一个android library for websockets在客户端。然而,第一个主要问题是,当服务器正在运行给定客户端的耗时操作时,其他潜在客户端需要等待......而且让 tornado 在多线程中工作似乎有点痛苦设置(因为它最初计划是单线程的)。另一个小问题是,如果客户端在服务器正在处理他的请求时掉线,那么当他重新连接时,客户端可能永远得不到结果。

因此,如果我想使用异步多线程 Python 服务器进行这样的设置,我想问一下您是否有任何解决方案或建议使用什么,该服务器应该使用来自不让其他潜在客户等待轮到他们的客户;并有可能使客户端在重新连接时能够从服务器获取结果。

最佳答案

首先,如果您要在后端执行CPU 密集型 操作,您[很可能] 需要在单独的进程 中运行它。不在线程/coro/等中。原因是 python 有时仅限于单线程(您可以阅读更多关于 GIL 的信息)。在多线程中执行 CPU 密集型操作可为您的后端提供一些可用性,但会影响整体性能。

  1. 对此的简单/旧解决方案 — 在多个进程(最好是线程)中运行您的后端。 IE。用 gunicorn 部署你的 flask ,给它多个工作进程。这样,您将拥有能够执行 number_of_processes - 1 繁重计算的系统,并且仍可用于处理请求。进程限制通常高达 cpu_cores * 2,具体取决于 cpu arch。

  2. 稍微复杂一些:

    • 接受数据
    • 在不同进程中运行重函数
    • 收集结果,返回

    这方面的好接口(interface)是 ProcessPoolExecutor .缺点是——更难处理失败/进程挂起

  3. 另一种方法是任务队列 + 工作线程。最常用的一个是 celery .想法是

    • 打开WS连接
    • 将任务放入队列
    • worker(在不同的进程甚至不同的物理节点)最终拿起任务,计算它,把结果放在一些数据库中
    • 主进程获取回调/对结果数据库的长轮询结果
    • 主进程通过 WS 发送结果

    这更适合真正繁重且非实时的任务,但为您提供开箱即用的故障/重启等处理。

关于android - Python 多线程服务器和与 Android 客户端的异步 websocket 通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54765230/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com