Python 每个会话存储大数据或服务连接

Python 每个会话存储大数据或服务连接,python,r,flask,rserve,pyrserve,Python,R,Flask,Rserve,Pyrserve,我正在编写一个小烧瓶应用程序,并使用pyRserve将其连接到Rserve。我希望每个会话都启动并维护自己的Rserve连接 大概是这样的: session['my_connection'] = pyRserve.connect() flask.g.my_connection = pyRserve.connect() 无法工作,因为连接对象不可JSON序列化。另一方面,类似这样的情况: session['my_connection'] = pyRserve.connect() flask.

我正在编写一个小烧瓶应用程序,并使用pyRserve将其连接到Rserve。我希望每个会话都启动并维护自己的Rserve连接

大概是这样的:

session['my_connection'] = pyRserve.connect()
flask.g.my_connection = pyRserve.connect()
无法工作,因为连接对象不可JSON序列化。另一方面,类似这样的情况:

session['my_connection'] = pyRserve.connect()
flask.g.my_connection = pyRserve.connect()
不起作用,因为它不会在请求之间持久化。更困难的是,pyRserve似乎没有为连接提供任何标识符,因此我无法在会话中存储连接ID,并在每次请求之前使用该ID检索正确的连接


是否有一种方法可以实现每个会话都有一个唯一的连接?

以下内容适用于您不希望为每个请求重新创建的任何全局Python数据,而不仅仅是rserve,也不仅仅是每个用户都唯一的数据

我们需要一些公共位置来为每个用户创建一个rserve连接。最简单的方法是作为单独的进程运行

import atexit
from multiprocessing import Lock
from multiprocessing.managers import BaseManager
import pyRserve

connections = {}
lock = Lock()


def get_connection(user_id):
    with lock:
        if user_id not in connections:
            connections[user_id] = pyRserve.connect()

        return connections[user_id]


@atexit.register
def close_connections():
    for connection in connections.values():
        connection.close()


manager = BaseManager(('', 37844), b'password')
manager.register('get_connection', get_connection)
server = manager.get_server()
server.serve_forever()
在启动应用程序之前运行它,以便管理器可用:

python rserve_manager.py

我们可以使用一个简单的功能在请求期间从应用程序访问此管理器。这假设您在会话中获得了“user_id”的值(例如,Flask登录就是这样做的)。这最终会使rserve连接在每个用户而不是每个会话中都是唯一的

from multiprocessing.managers import BaseManager
from flask import g, session

def get_rserve():
    if not hasattr(g, 'rserve'):
        manager = BaseManager(('', 37844), b'password')
        manager.register('get_connection')
        manager.connect()
        g.rserve = manager.get_connection(session['user_id'])

    return g.rserve
在视图中访问它:

result = get_rserve().eval('3 + 5')


这应该可以让你开始,尽管还有很多可以改进的地方,比如不硬编码地址和密码,不丢弃与管理器的连接。这是用Python3编写的,但应与Python2一起使用。

为什么需要在会话中使用相同的连接?因为我需要R命名空间中的对象在会话期间为同一用户保留(但其他用户不可见/不可访问)。例如,用户可能会加载一些数据并安装一个模型-我希望能够在其他页面上访问该模型(无需重新安装它)(即在发出其他Flask请求后)。我明白了。我不确定每个用户是否真的需要一个可重复使用的连接。我唯一的要求是,用户的R连接/会话能够访问使用该用户以前的请求创建的R对象。我认为一个可行的解决方案可能是让一个R连接将当前的R工作区保存到服务器,将该工作区的ID保存为cookie,并在收到新请求时,让一个新的R连接重新读取该工作区……看看DeployR()-它在Rserve的基础上添加了API和其他功能,使管理此类需求变得更加容易。@Andrie我考虑过这一点-尽管看起来只有Java、Javascript和.NET的客户端库。我只限于python。。。