Heim > Backend-Entwicklung > Python-Tutorial > Python verteilte Sperre

Python verteilte Sperre

巴扎黑
Freigeben: 2016-12-09 14:49:19
Original
1349 Leute haben es durchsucht

Um wiederholte Berechnungen zu vermeiden, können bei zeitaufwändigen Abfragen verteilte Sperrdienste verwendet werden.
Es wird jeweils nur ein Vorgang ausgeführt, und ähnliche Vorgänge warten darauf, erneut versucht zu werden Der folgende Code (fetch_with_dist_lock) definiert einen Fetcher und einen Updater.
Wenn der Fetcher die Daten nicht abrufen kann, wird der Updater zum Aktualisieren verwendet Es gibt auch Situationen, in denen wir nur aktualisieren möchten. Es gibt mehrere Updater für bestimmte Daten, aber der Update-Vorgang ist nicht atomar. Dann führen wir ihn über update_with_dist_lock aus


def fetch_with_dist_lock(mc_store, mutex_key, fetcher, updater,
                        lock_time=3*60*1000, sleep_time=100, retry_times=3):
    i = 0
    while i < retry_times:
        i += 1
        need_update, results = fetcher()
        if need_update:
            if(mc_store.add(mutex_key, lock_time)):
                try:
                    updater()
                    continue
                finally:
                    #release the distribute mutex anyway
                    mc_store.delete(mutex_key)
            else:
                time.sleep((sleep_time*1.0)/1000)
                continue
        return results
    #too much tries, but failed still.
    return None
def f_wrapper(f, *args, **kwargs):
    def _():
        return f(*args, **kwargs)
    return _
def update_with_dist_lock(mc_store, mutex_key, updater, lock_time=60*1000, sleep_time=100, retry_times=5):
    i = 0
    while i < retry_times:
        i += 1
        if (mc_store.add(mutex_key, lock_time)):
            try:
                updater()
                return True
            finally:
                mc_store.delete(mutex_key)
        else:
            time.sleep((sleep_time*1.0)/1000)
            continue
    return False
Nach dem Login kopieren
Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage