参考k8s的leader选举: k8s.io/client-go/tools/leaderelection
import os
import socket
import time
from threading import Thread
import etcd3
class DistributedLock(object):
def __init__(self, etcd, name, ttl, renew):
self.etcd: etcd3.Etcd3Client = etcd
self.key = f"/locks/{name}"
self.value = f"{socket.gethostname()}-{os.getpid()}"
self.renew_value = lambda: self.value + f" {time.time()}"
self.ttl = ttl
self.renew = renew
self.acquired = False
self.holder = None
def acquire(self):
value = self.etcd.get(self.key)[0]
if value is None:
print('init acquire')
succeeded, resp = self.etcd.transaction(compare=[etcd.transactions.create(self.key) == 0],
success=[etcd