从多个进程更新SQLAlchemy字段threadsafe

时间:2013-03-26 22:41:42

标签: multithreading sqlalchemy distributed

我有一个数据库表,用于描述在分布式系统上处理的作业。因此,整个工作分为许多小部件,每个部件在其自己的环境中在不同的机器上处理。

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

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

1 个答案:

答案 0 :(得分:0)

如果你想更新 - 我假设 - 文本字段并行,这就是它在内部发生的方式:每个实例在实例化对象时读取原始字段(sessionmaker要小心这样,对于每个线程,都有一个数据保持实体的实例),并将其部分附加在版本的字段上。然后它自己的实例被调整。你得到的结果是 - 完全线程安全 - 最后版本。 写的最后一个对象获胜。

如果您希望所有您的数据通过数据结构提交到同一字段,您必须抛弃线程的任何好处,并同步您的阅读和编写实体实例,以便每个线程等待读取数据(用于追加),直到它的前任编译完毕。

应该做什么:将数据结构更改为使用 SQL数据库的好处,并使每个更新自己的SQL记录