问题描述
单进程启动时,全局变量的读写都没有问题,但是用gunicorn起的多worker,全局变量没法共享
原因
gunicorn多worker之间,数据没办法用全局变量共享
解决方法
因为需要同时修改数据,并且共享,所以选择共享文件的方式解决
class BaseIncrease(object):
_instance_lock = threading.Lock()
num = None
date = None
_instance = None
data_type = 'FG_GROUP_ID'
@classmethod
@abc.abstractmethod
def get_init_num(cls):
pass
@classmethod
@abc.abstractmethod
def get_serial_num(cls):
pass
def __new__(cls, *args, **kwargs):
if not cls._instance:
with cls._instance_lock:
if not cls._instance:
cls._instance = object.__new__(cls)
cls.date = datetime.date.today().strftime("%Y%m%d")
cls.num = cls.get_init_num()
return cls._instance
@classmethod
def get_num(cls):
date = datetime.date.today().strftime("%Y%m%d")
with open(os.path.dirname(os.path.realpath(__file__)) + f'/{cls.data_type}', 'r+', encoding='utf8') as f:
fcntl.flock(f, fcntl.LOCK_EX)
if cls.date != date:
cls.date = date
f.seek(0)
f.truncate()
f.write("1")
cls.num = 1
else:
num = f.readline()
cls.num = int(num) + 1
f.seek(0)
f.truncate()
f.write(str(cls.num))