以下适用于任何全局Python数据,您不想为每个请求重新创建,不仅限于rserve,也不仅限于每个用户独有的数据。
我们需要一个共同的位置来为每个用户创建一个rserve连接。最简单的方法是运行一个
multiprocessing.Manager
作为一个单独的进程。
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-Login会这样做)。这最终使得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')
这应该可以让您开始,虽然有很多可以改进的地方,比如不要硬编码地址和密码,不要丢弃与管理器的连接。这是使用Python 3编写的,但应该可以在Python 2中工作。