2017-01-27 8 views
0

я хотел бы знать, что это лучший способ для имитации PostGreSQL nexval в питоне 3.Как имитировать последовательность PostGreSQL NEXTVAL в питоне 3

Я хотел бы иметь переменный/объект Attr, значение которого autoincremented на запросить его ценность. То же самое, как работает следующая последовательность db. Это будет «ежедневный секвенсер», значение которого увеличивается при каждом вызове get (и будет перезагружаться в полночь с помощью cronjob).

Моя идея состояла в том, чтобы использовать Singleton (с некоторым постоянным кешем в обратном направлении), но он терпит неудачу в многопоточной среде.

class OnlyOne: 
    class __OnlyOne: 
     key = "key" 

     def __init__(self): 
      val = cache.get(self.key, None) 
      if val is None: 
       val = 0 
       cache.set(self.key, val) 
      self.val = val 

     def __str__(self): 
      return str(self.nextval) 

     @property 
     def nextval(self): 
      self.val += 1 
      cache.set(self.key, self.val) 
      return self.val 

    instance = None 

    def __init__(self): 
     if not OnlyOne.instance: 
      OnlyOne.instance = OnlyOne.__OnlyOne() 

    def __getattr__(self, name): 
     return getattr(self.instance, name) 

У кого-нибудь есть идея?

Благодаря

ответ

0

Python имеет библиотеку под названием threading для этого.

import threading 

Я думаю, что самое простое решение - просто поместить замок вокруг вашего имущества. Вы можете думать о том, как лучше реализовать, но вы можете создать в вашем __init__ в Lock:

self.lock = threading.Lock() 

А затем обернуть доступ атрибута с фиксатором:

self.lock.acquire() # grab the lock 
# Code in here is single threaded 
self.val += 1 
retval = self.val 
cache.set(self.key, self.val) 
self.lock.release() # release the lock 

return retval # Returning this to avoid a race with self.val 
+0

Спасибо за помощь. К несчастью, я не смог сделать его многопроцессорным. Конечным решением для меня является создание async-задачи для очереди сельдерея с одним рабочим, поэтому его небольшое узкое место, но оно быстро и не так болезненно. – Pavel

 Смежные вопросы

  • Нет связанных вопросов^_^