我有一个数据库表,用于描述在分布式系统上处理的作业。因此,整个工作分为许多小部件,每个部件在其自己的环境中在不同的机器上处理。
我想保留每个进程如何运行的简单日志,因此每个节点都使用SQLAlchemy连接到同一作业表,并将其作业号和状态附加到UnicodeText字段的末尾。
我希望看到类似的内容:
Part 1: complete<br/>
Part 2: complete<br/>
Part 3: error<br/>
Part 4: complete<br/>
...etc
我只是在完成处理部件时在每个节点上执行process.log += "Part 1: complete\n"
。然后是session.commit()
我知道零件编号会出现故障,这对我的目的来说很好,但正在发生的事情是我只获得了总零件的几个条目。我认为这是因为许多作业同时完成并且附加+ =不是线程安全的。
我对会话不太满意,所以我不知道如何配置它。我确实尝试使用NullPool无济于事。
有没有办法在这样的分布式环境中使追加操作线程安全?
答案 0 :(得分:0)
如果你想更新 - 我假设 - 文本字段并行,这就是它在内部发生的方式:每个实例在实例化对象时读取原始字段(sessionmaker
要小心这样,对于每个线程,都有一个数据保持实体的实例),并将其部分附加在其版本的字段上。然后它自己的实例被调整。你得到的结果是 - 完全线程安全 - 最后版本。
写的最后一个对象获胜。
如果您希望所有您的数据通过此数据结构提交到同一字段,您必须抛弃线程的任何好处,并同步您的阅读和编写实体实例,以便每个线程等待读取数据(用于追加),直到它的前任编译完毕。
应该做什么:将数据结构更改为使用 SQL数据库的好处,并使每个更新自己的SQL记录