2013-03-26 85 views
0

我有一个数据库表,它描述了在分布式系统上处理的作业。因此,整个工作分成许多小部分,每个部分在自己的环境中的不同机器上处理。从多个进程更新SQLAlchemy字段线程安全

我想保留一个简单的日志,告诉每个进程如何生效,因此每个节点都使用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()

我知道零件号码将失序,这对我的目的是好的,但发生了什么事情,而是我只获得总零件的几个条目。我认为这是因为许多作业正在同时完成,并且执行append + =不是线程安全的。

我对会议不太了解,所以我不知道所有的技巧来配置它。我曾尝试使用NullPool无效。

有没有什么办法可以在这样的分布式环境中使append操作线程安全?

回答

0

如果你想更新 - 我认为 - 在文本字段平行这是怎么回事内部:实例化对象(sessionmaker负责的这一点,所以对于每个线程,当每个实例读取原始场有一个数据保持实体的实例),并将其部分追加到版本的字段中。然后它自己的实例被编译。作为结果得到的是一个完美的线程安全的最新版本。 写出的最后一个对象获胜。

如果你想致力于与这个数据结构相同领域的所有你的数据,你必须扔掉线程的任何好处,并同步您的实体实例的阅读和写作,让每一个线程等待读取数据(用于追加),直到前一个线程完成。

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

+0

有道理。感谢您的澄清。我知道类似的事情正在发生,但无法确定操作的确切顺序。在这种情况下,每个部分的记录对于我所需要的都是过度的,但总的来说,我认为你对使用数据库是有利的。我以某种方式解决了这个问题,但是我不记得那么久了。 :o – user1914881 2014-01-24 02:31:21