0

我有一个描述在分布式系统上处理的作业的数据库表。所以整个工作被分成许多小部分,每个部分都在不同的机器上在它自己的环境中处理。

我想保留每个进程如何运行的简单日志,因此每个节点都使用 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 无济于事。

有没有办法让附加操作线程在这样的分布式环境中安全?

4

1 回答 1

0

如果您想并行更新一个 - 我假设 - 文本字段,这就是它在内部进行的方式:每个实例在实例化对象时读取原始字段(sessionmaker负责这个,因此对于每个线程都有一个数据实例-控股实体)并将其部分附加到字段版本上。然后提交它自己的实例。结果你得到的是一个 - 完全线程安全的 - 最后一个版本。最后写入的对象获胜。

如果您希望使用此数据结构将所有数据提交到同一字段,则必须放弃线程的任何好处,并同步您对实体实例的读取和写入,以便每个线程等待读取数据(例如append) 直到它的前任提交之后。

该做什么:改变你的数据结构以利用SQL 数据库的好处,并让每个更新都有自己的 SQL 记录。

于 2014-01-23T22:18:26.727 回答