当前位置: 首页 > 知识库问答 >
问题:

在Flask-SocketIO多重处理中将套接字作为参数传递

杜骏祥
2023-03-14

我正在尝试让Flask SocketIO服务器使用多处理。服务器无需多处理即可正常工作。我需要在通过访问路由调用的函数中发出SocketIO消息。之前,我是通过将socketio作为参数传递给函数,然后使用socketio来实现的。emit(),工作正常。不幸的是,当我用pool将函数添加到pool时。apply(),我得到TypeError:无法序列化'greenlet'。greenlet对象。如果我没有通过套接字,它会工作,但显然我没有得到我需要的套接字功能。导致此错误的原因是什么?如何更正?我没有使用gunicorn或eventlet或gevent或其他任何东西。

我的简化代码:

def requester(user, socket):

    socket.emit('hello')
    # do some stuff with requests and databases
    socket.emit('goodbye')

def main():

    app = Flask(__name__,
                static_url_path='',
                static_folder='dist',
                template_folder='dist')

    socketio = SocketIO(app)

    pool = multiprocessing.Pool(16)

    @app.route('/addname', methods=['POST'])
    def add_name:
        pool.apply(requester, args=(request.json['user'], socketio))
        return request.json['user'], 201

    socketio.run(app, host='0.0.0.0', port=8000)

if __name__ == '__main__':
    main()

共有1个答案

魏威
2023-03-14

我没有使用gunicorn或eventlet或gevent或其他任何东西。

很明显,您使用的是基于greenlet的框架。异步框架的选择是自动的,因此通过在virtualenv greenlets上安装eventlet或gevent,可以使用异步框架。如果不想使用这些,请确保未安装eventlet或gevent。

我正在尝试让Flask SocketIO服务器使用多处理。

这是行不通的,因为插座。IO是一个有状态的服务器,您不能仅通过运行多个工作进程来扩展。

有关从辅助进程向客户端发送的推荐方法,请参阅关于从外部进程发送的留档。

 类似资料:
  • 问题内容: 我有一个界面: 和一个实现它的类 第三类实现了此方法: 现在我试图像这样调用该方法 但我不断得到一个例外说: 如果它连接了该类,该方法不起作用吗? 问题答案: 也许你需要

  • 假设我们有python中的函数: 虽然我可能会将传递给A,但我正在寻找一种优雅的方法来传递类似于的东西来执行。 我现在看到的唯一方法是发送一个函数列表并按顺序应用它们。有没有更好的办法?

  • 在Python中,我可以很容易地将函数作为参数传递,并在另一个函数内部执行。

  • 我的服务是开始Spring批工作。我希望能够传递一些对象给作业,每次这个对象参数都会不同。这个对象我需要在我的任务中使用。我开始工作的JobLauncher。据我谷歌,我看到JobParameters不会帮助我在这种情况下。此外,我发现很多答案是使用JobExecttionContext或任何东西。但是我想在作业开始前注入参数对象。它是可拥有的吗? 开始工作的服务 我的小任务

  • Flask-SocketIO Socket.IO integration for Flask applications. Sponsors The following organizations are funding this project: Socket.IO Add your company here! Many individual sponsors also support this

  • 问题内容: 我正在尝试制作一个方法,该方法的参数为,等等,然后返回。 我将为该方法提供的所有可能的类均从该方法扩展并具有方法。 我的代码: 致电者: 但是,这根本不起作用。 请问我该怎么做? 问题答案: 我想你想做 希望像这样的东西行得通(我的反思能力真的不是那么好)。

  • 问题内容: 我想使用数组作为参数调用一个函数: 有路过的内容的一种更好的方式进入? 问题答案: const args = [‘p0’, ‘p1’, ‘p2’]; call_me.apply(this, args); 请参阅MDN文档。 如果环境支持ECMAScript6,则可以改用传播参数:

  • 问题内容: 在Java中,如何将一个函数作为另一个函数的参数传递? 问题答案: Java 8及以上 如果你的类或接口只有一个抽象方法(有时称为SAM type),则使用Java 8+ lambda表达式,例如: 然后可以在使用MyInterface的任何地方替换lambda表达式: 例如,你可以非常快速地创建一个新线程: 并使用方法引用语法使其更加清晰: 如果没有 lambda表达式,则最后两个示