以下是一个不使用关系数据库的全局顺序号生成器的解决方法的示例代码:
import threading
class GlobalSequenceGenerator:
def __init__(self):
self.counter = 0
self.lock = threading.Lock()
def generate_sequence_number(self):
with self.lock:
self.counter += 1
return self.counter
# 示例用法
generator = GlobalSequenceGenerator()
# 在不同的线程中生成序列号
def generate_sequence():
sequence_number = generator.generate_sequence_number()
print(f"Generated sequence number: {sequence_number}")
# 创建多个线程并启动
threads = []
for _ in range(10):
thread = threading.Thread(target=generate_sequence)
threads.append(thread)
thread.start()
# 等待所有线程完成
for thread in threads:
thread.join()
在这个示例中,GlobalSequenceGenerator
类包含一个计数器变量 counter
和一个锁对象 lock
。在 generate_sequence_number
方法中,通过获取锁来保证每次只有一个线程可以增加计数器的值,并返回新生成的序列号。
在示例的用法部分,我们创建了10个不同的线程来生成序列号。通过运行这段代码,我们可以观察到每个线程生成的序列号是唯一的且按顺序递增的。
这种方法的一个限制是,如果程序重启,计数器将会从1开始。如果需要在程序重启后保持全局的顺序号生成,可以将计数器的值存储在持久化的存储介质(如磁盘文件、缓存服务器等)中,并在程序启动时加载并恢复计数器的值。