gpt4 book ai didi

Python重叠进程?

转载 作者:行者123 更新时间:2023-12-01 09:28:24 27 4
gpt4 key购买 nike

我遇到了一些奇怪的行为,并且我不确定如何解决这个问题。

概述:

我有一个 Linux/Ubuntu 服务器,其 API 每小时接收数千条记录。这些记录存储在我的数据库中的一个表中,我们将其称为临时表,稍后将在其中处理记录。

我每分钟运行一个 cron 来从这个暂存表中获取 x 条记录,并使用一个简单的 python 脚本来处理它们。

问题:

假设这个脚本每分钟可以处理 x 条记录。然后每个进程在下一个进程开始之前完成。但是,如果我将尝试处理的记录数量增加到 2 倍,那么当下一个在时间 1 触发的 cron 启动时,在时间 0 触发的 cron 尚未完成处理它的一批记录。现在我们有两个正在运行的进程,一个是在时间 0 触发的 cron,即将完成,另一个是在时间 1 触发的 cron,刚刚开始。

这就是意想不到的事情发生的地方。我在脚本中有一个简单的函数来处理并将处理后的结果保存到另一个表中。当两个脚本重叠时(如上所述),这些记录每个都会保存到数据库中两次。如果只有一个进程正在运行,则只会保存一次。

我摸不着头脑,不知道这是怎么可能的,因为每个脚本应该是独立的。我不认为包含代码会有用,因为它实际上只是一个 cron 触发脚本来 1. 从暂存表中提取记录。 2. 对这些记录进行更改 3. 将这些更改的记录保存到新表中。

如果您认为这有帮助,我很乐意上传该问题的代码。有人能指出我正确的方向吗?

谢谢

最佳答案

解决方案 1:使用 MySQL 读锁

如果您怀疑启动多个脚本时可能会发生这种情况,那么您应该使用读锁。 Read About Locks Here

MySQL allows a client session to acquire a table lock explicitly for preventing other sessions from accessing the table during a specific period. A client session can acquire or release table locks only for itself. It cannot acquire or release table locks for other sessions.

解决方案 2:对临时表使用 Redis Presistence 排队

Redis 在消费者脚本之前充当队列,并允许逐 block 传送。

RQ (Redis Queue) is a simple Python library for queueing jobs and processing them in the background with workers. It is backed by Redis and it is designed to have a low barrier to entry. It can be integrated in your web stack easily.

关于Python重叠进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50158808/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com