我有一个包含要解析的数据的表和一个worker,它从中获取几个记录,对其进行处理并保存回来。它还将标志设置为“parsed”。在
现在我要运行worker的几个实例,并确保两个worker不会同时选择同一行进行处理。所以我需要阻止它。在
我使用的是django,从MySQL手册中读到的内容,可以获得一个行级锁,但我找不到任何正确执行此操作的示例。唯一一个说它非常慢:)http://djangosnippets.org/snippets/2039/
我可以有另一个字段,名为“lock until”,它是一个时间戳,在worker选择了一行之后更新为now+X分钟。这将缩短锁定时间(选择后立即更新),并阻止另一个工作线程选择该行,该工作进程将检查该行是否未“锁定”,但在选择和更新之间仍然存在锁定问题。在
谢谢! 伊恩
在Mysql中存储数据的两种主要方式是MyISAM和InnoDB。各有利弊-
就django模型而言,它们默认支持myisam表创建。如果需要表具有行级锁,则需要innodb。This page应该是一个好的起点:
它记录了一种钩住
post_syncdb
钩子的方法,以动态地发出ALTER
SQL命令来更改表的引擎。(请注意,这是4年前编写的,可能需要更新到Django的当前版本)。在将元数据添加到模型中应该很简单,这样可以指定每个表使用哪个存储引擎。然后,您可以修改上面的示例,以关闭该元数据。在
有了锁,第二个工人就会被卡住,等待锁释放。在
也许您可以在开始处理之前将条目标记为“workstartedonthissentry at[timestamp]”,并让后续的工作人员忽略这些行。然后,您可以有一个cron作业或类似的“释放”行,这些行的时间戳早于某个阈值,但还没有标记为“done”(表示工作线程死了或发生了其他错误)
相关问题 更多 >
编程相关推荐