大概我有多个python程序在运行,我希望有一个公用的计数器,不同的python程序都可以加1,也可以获取当前计数。
实现的方法很多,通过缓存或redis都可以实现。
但这里,我想要一个更轻松简易的实现方式。更方便,更快捷。
比如引入一个python模块,就立刻能解决这个问题。
有没有啥现成的解决方式,自己写一个python模块,用指定路径的文件作为记录,一来是锁的问题,二来是不如内存这么快,有没有类似简易快捷的解决方案。
jerkzhang
我感觉,还是就redis非常适合这个,可靠高效。
不过我觉得,你想要找的是“python 不同进程之间 共享内存”。
python的标准库 multiprocessing.shared_memory --- 可跨进程直接访问的共享内存
但是我感觉你要找的是基于这个做好的工具。
类似的也有一些,但你想要的应该是比较轻量级,使用起来比较方便的;nmap我考虑过的,但感觉似乎有更适合你需求的。
似乎我没注意,也许你可以考虑使用标准模块SharedMemory类自己写一个。
示例:
#coding=utf-8
import ctypes
from multiprocessing import shared_memory, Lock
import os
class SharedCounter:
def __init__(self, name=None):
self._shm = None
self._counter = None
self.lock = Lock()
self._created_shm = False
if name is None:
# 创建新的共享内存
self._shm = shared_memory.SharedMemory(create=True, size=ctypes.sizeof(ctypes.c_int64))
self._counter = ctypes.cast(
ctypes.addressof(ctypes.c_int64.from_buffer(self._shm.buf)),
ctypes.POINTER(ctypes.c_int64)
)
self._counter[0] = 0
self._created_shm = True
else:
# 连接到已有的共享内存
self._shm = shared_memory.SharedMemory(name=name)
self._counter = ctypes.cast(
ctypes.addressof(ctypes.c_int64.from_buffer(self._shm.buf)),
ctypes.POINTER(ctypes.c_int64)
)
self._created_shm = False
def __del__(self):
if self._shm is not None:
self._shm.close()
# 不要自动unlink共享内存,以便其他进程可以继续使用
@classmethod
def connect(cls, name):
instance = cls.__new__(cls)
instance.__init__(name=name)
return instance
def increment(self):
with self.lock:
self._counter[0] += 1
def get_value(self):
return self._counter[0]
def reset(self):
with self.lock:
self._counter[0] = 0
def get_shared_memory_name(self):
return self._shm.name if self._shm else None
def close(self):
if self._shm is not None:
self._shm.close()
def unlink(self):
if self._shm is not None and self._created_shm:
self._shm.unlink()
# 示例使用
if __name__ == "__main__":
# 创建计数器
counter = SharedCounter()
# 打印共享内存的名称
print(f"Shared memory name: {counter.get_shared_memory_name()}")
# 增加计数器
counter.increment()
# 获取当前值
value = counter.get_value()
print(f"Current value: {value}")
# 重置计数器
counter.reset()
print(f"After reset: {counter.get_value()}")
# 记得在最后一个进程使用后关闭共享内存
counter.close()但是还是不推荐这样自己写,还是强烈推荐使用redis来,redis非常适合做这个。