我有一个扭曲的守护进程,它可以进行一些 xml 提要解析。
我通过 twisted.enterprise.adbapi 将数据存储在 PostgreSQL 中,IIRC 正在包装 psycopg2
我在将数据存储到数据库时遇到了一些问题——重复数据会定期进入数据库。
老实说,我的实现存在一些潜在的问题,应该重做并设计得更好。不过,我没有时间和资源来做这件事——所以我们现在处于“保持运行”模式。
我认为问题可能来自我对 deferToThread 的使用或我在开始时如何生成服务器。
作为对我认为有问题的功能的快速概述:
Twisted 查询 Postgres 以获取应分析的帐户,并对其设置块
SELECT
id
FROM
xml_sources
WHERE
timestamp_last_process < ( CURRENT_TIMESTAMP AT TIME ZONE 'UTC' - INTERVAL '4 HOUR' )
AND
is_processing_block IS NULL ;
lock_ids = [ i['id'] for i in results ]
UPDATE xml_sources SET is_processing_block = True WHERE id IN %(lock_ids)s
我认为正在发生的事情是(意外地)运行多个服务器或各种其他问题导致多个线程处理这些数据。
我认为如果我将这个快速部分包装在一个独占表锁中,这可能会得到解决——或者至少被排除为一个问题。
不过,我以前从未通过扭曲完成表锁定。谁能指出我正确的方向?