使用python在sqlite数据库上并发
Posted
技术标签:
【中文标题】使用python在sqlite数据库上并发【英文标题】:Concurrency on sqlite database using python 【发布时间】:2012-07-11 10:07:51 【问题描述】:有一个我要处理的数据列表。但是我需要用多个实例处理数据以提高效率。
每个实例每次取出一个项目,从列表中删除,并通过一些程序进行处理。
首先我尝试将列表存储在 sqlite 数据库中,但 sqlite 允许多个读锁,这意味着多个实例可能会从数据库中获取相同的项目。
有没有什么方法可以让每个实例都得到一个唯一的项目来处理? 如果需要,我可以使用其他数据结构(其他数据库或只是文件)。
顺便问一下,有没有办法在执行 cursor.execute(delete_query) 之后检查 DELETE 操作是否成功?
【问题讨论】:
【参考方案1】:db 中的另一个字段作为标志(例如 PROCESSING、UNPROCESSED、PROCESSED)怎么样?
【讨论】:
【参考方案2】:据我所知,您需要启动多个 python 解释器实例才能获得与 python 的真正并发(或至少多个执行进程,以便您可以:
创建 1 个代理进程,告诉其他人他们可以获取哪些记录(例如通过 0mq 之类的方式),但这可能会有效地使您的代理成为瓶颈。 如果您的数据易于整除(例如,主键的升序数字),则按进程划分部分数据库。像greenlets 和tasklets 这样的东西实际上是一个接一个地执行,它们切换得非常快,因为它们没有真正的线程/进程开销,但它们并没有真正并发执行。
【讨论】:
【参考方案3】:最简单的方法是在单个进程中生成项目并将它们传递给多个工作进程进行处理,例如:
from multiprocessing import Pool
def process(item):
pass # executed in worker processes
def main():
p = Pool() # use all available CPUs
for result in p.imap_unordered(process, open('items.txt')):
pass
if __name__=='__main__':
main()
【讨论】:
如果我需要在不同的计算机上同时运行实例,我可以使用多处理模块吗? 是的,使用 BaseManager 访问共享队列(.put/.get 作业)。作为替代方案,您可以尝试celery
(更高级别的接口)【参考方案4】:
为什么不从数据库中读取所有项目并将它们放入队列中?您可以让工作线程获取项目,对其进行处理并继续进行下一个。
【讨论】:
以上是关于使用python在sqlite数据库上并发的主要内容,如果未能解决你的问题,请参考以下文章