【问题标题】:Run python job every x minutes每 x 分钟运行一次 python 作业
【发布时间】:2015-07-13 21:42:02
【问题描述】:

我有一个小的 python 脚本,它基本上连接到 SQL Server (Micrsoft) 数据库并从那里获取用户,然后将它们同步到另一个 mysql 数据库,基本上我只是运行查询来检查用户是否存在,如果不存在,然后将该用户添加到 mysql 数据库中。

脚本通常需要大约 1 分钟才能同步。我要求脚本每 5 分钟(例如)恰好执行一次(每 5 分钟同步一次)。

构建这个的最佳方式是什么?

我有一些用户的测试数据,但在真实站点上,用户更多,所以我不能保证脚本需要 1 分钟才能执行,甚至可能需要 20 分钟。但是,每次执行脚本时间隔 15 分钟将是解决问题的理想选择...

更新: 我有 sql server windows db 的连接参数,所以我使用一个小型 ubuntu 服务器在位于不同服务器上的两个数据库之间进行同步。所以假设 db1 (windows) 和 db2 (linux) 是数据库服务器,我使用 s1 (python server) 和 pymssql 和 mysql python 模块来同步。

问候

【问题讨论】:

  • 你使用的是什么操作系统?
  • 抱歉早该澄清了,目前是Ubuntu,详情请看原帖编辑

标签: python mysql sql-server


【解决方案1】:

我不确定cron 是否适合这份工作。在我看来,如果你让它每 15 分钟运行一次,但有时同步需要 20 分钟,你可能会同时运行多个进程并可能发生冲突。

如果驱动力是可变执行时间之间的恒定等待时间,那么您可能需要一个持续运行的进程并等待。

def main():
    loopInt = 0
    while(loopInt < 10000):
        synchDatabase() 

        loopInt += 1
        print("call #" + str(loopInt))
        time.sleep(300)  #sleep 5 minutes

main()

(显然不是连续的,而是长时间运行)你可以将while的结果设置为true,它将是连续的。 (注释掉loopInt += 1

编辑添加:请参阅 cmets 中关于监控进程的说明,因为您不希望脚本挂起或崩溃并且您不知道。

【讨论】:

  • 如果你要做这样的事情,我会有一个小的 bash scriptlet,比如说,每小时检查一次,看看脚本是否正在运行。 (可能使用flock 来确保我得到一份脚本,而不是几份)
【解决方案2】:

您可能希望使用处理队列的系统,例如 RabbitMQ,并使用 Celery 作为 python 接口来实现它。使用 Celery,您可以将任务(如执行脚本)添加到队列或运行将在给定时间间隔后执行任务的计划(就像 cron)。

开始使用http://celery.readthedocs.org/en/latest/

【讨论】:

  • 我明白了,我想像这样运行它:(运行)15 分钟间隙(运行)15 分钟间隙(运行)......每次运行都可以花费任意时间当它完成时,如果脚本卡住可能会超时,芹菜会有帮助吗?
  • 是的。 Celery 有一个组件beat,它将所有计划任务放入队列中。然后它的worker 组件确保任务完成。
猜你喜欢
  • 2013-11-27
  • 1970-01-01
  • 1970-01-01
  • 2017-01-18
  • 1970-01-01
  • 2021-03-09
  • 2016-10-18
  • 1970-01-01
  • 2020-02-23
相关资源
最近更新 更多