我正在使用Gunicorn和Flask(Pythonn 3.6)开展一项小型服务.下面的伪代码大致显示了我想要的行为.有很多序列化foo对象,我希望尽可能多地在内存中保存它们并在LRU基础上删除它们.
cache = Cache()
@app.route('/')
def foobar():
name = request.args['name']
foo = cache.get(name)
if foo is None:
foo = load_foo(name)
cache.add(foo)
return foo.bar()
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是我不知道如何在Gunicorn工作人员之间分享这个缓存.我正在使用有限的内存,不想持有重复的对象.某些对象会经常使用,有些可能永远不会使用,所以我认为把它们放在内存中真的很有意义.
这只是从另一个应用程序(都在同一台服务器上运行)接收请求的东西,我只是想将这些代码分开.首先,即使使用Gunicorn我也会走向完全错误的方向吗?
这是针对 Python 3.6 的。
编辑并删除了很多无关紧要的内容。
我原以为json比 Stack Overflow 上的其他答案和评论更快pickle,看起来很多其他人也相信这一点。
我的测试合格吗?差距比我想象的要大得多。我在非常大的物体上测试得到了相同的结果。
import json
import pickle
import timeit
file_name = 'foo'
num_tests = 100000
obj = {1: 1}
command = 'pickle.dumps(obj)'
setup = 'from __main__ import pickle, obj'
result = timeit.timeit(command, setup=setup, number=num_tests)
print("pickle: %f seconds" % result)
command = 'json.dumps(obj)'
setup = 'from __main__ import json, obj'
result = timeit.timeit(command, setup=setup, number=num_tests)
print("json: %f seconds" % result)
Run Code Online (Sandbox Code Playgroud)
和输出:
pickle: 0.054130 seconds
json: 0.467168 seconds
Run Code Online (Sandbox Code Playgroud)