gpt4 book ai didi

python - 具有 stdlib 或最小依赖性的 Python 中的持久多进程共享缓存

转载 作者:太空狗 更新时间:2023-10-30 00:07:25 25 4
gpt4 key购买 nike

我刚刚尝试了 Python shelve模块作为从外部服务获取的数据的持久缓存。 The complete example is here .

我想知道如果我想让这个多进程安全,最好的方法是什么?我知道 redis、memcached 和此类“真正的解决方案”,但我只想使用 Python 标准库的部分或非常小的依赖项来保持我的代码紧凑,并且在单进程中运行代码时不会引入不必要的复杂性 -单线程模型。

想出一个单进程解决方案很容易,但这在当前的 Python 网络运行时并不适用。具体来说,问题是在 Apache + mod_wsgi 环境中

  • 只有一个进程更新缓存数据一次(文件锁,不知何故?)

  • 其他进程在更新过程中使用缓存的数据

  • 如果进程未能更新缓存数据,则在另一个进程可以再次尝试之前会受到 N 分钟的惩罚(以防止 thundering herd 等)- 如何在 mod_wsgi 进程之间发出信号

    <
  • 为此您不使用任何“重型工具”,仅使用 Python 标准库和 UNIX

此外,如果某些 PyPi 包在没有外部依赖的情况下执行此操作,请告诉我。欢迎使用其他方法和建议,例如“只使用 sqlite”。

例子:

import datetime
import os
import shelve
import logging


logger = logging.getLogger(__name__)


class Converter:

def __init__(self, fpath):
self.last_updated = None
self.data = None

self.data = shelve.open(fpath)

if os.path.exists(fpath):
self.last_updated = datetime.datetime.fromtimestamp(os.path.getmtime(fpath))

def convert(self, source, target, amount, update=True, determiner="24h_avg"):
# Do something with cached data
pass

def is_up_to_date(self):
if not self.last_updated:
return False

return datetime.datetime.now() < self.last_updated + self.refresh_delay

def update(self):
try:
# Update data from the external server
self.last_updated = datetime.datetime.now()
self.data.sync()
except Exception as e:
logger.error("Could not refresh market data: %s %s", self.api_url, e)
logger.exception(e)

最佳答案

我会说你想使用一些现有的缓存库,dogpile.cache我想到,它已经具有许多功能,您可以轻松插入您可能需要的后端。

dogpile.cache 文档说明如下:

This “get-or-create” pattern is the entire key to the “Dogpile” system, which coordinates a single value creation operation among many concurrent get operations for a particular key, eliminating the issue of an expired value being redundantly re-generated by many workers simultaneously.

关于python - 具有 stdlib 或最小依赖性的 Python 中的持久多进程共享缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20420148/

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