【问题标题】:Update SQLAlchemy field threadsafe from multiple processes从多个进程更新 SQLAlchemy 字段线程安全
【发布时间】:2013-03-16 22:33:16
【问题描述】:

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

我想记录每个进程的运行情况,因此每个节点都使用 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 无济于事。

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

【问题讨论】:

    标签: multithreading sqlalchemy distributed


    【解决方案1】:

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

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

    应该做什么:改变你的数据结构以使用 SQL数据库的好处,并让每个更新它自己的SQL记录.

    【讨论】:

    • 有道理。感谢您的澄清。我有点知道发生了类似的事情,但无法确定确切的操作顺序。在这种情况下,为每个部分创建记录对于我需要的东西来说是多余的,但总的来说,我认为您使用数据库来发挥自己的优势是正确的。我以某种方式解决了它,但是时间太长了,我不记得如何了。 :O
    猜你喜欢
    • 2020-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-17
    • 1970-01-01
    • 2012-07-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多