【发布时间】:2023-04-05 18:04:01
【问题描述】:
我有一些脚本需要作为单独的进程同时运行。我的计划是有一个 cron 作业,以设定的时间间隔执行这些脚本的多个实例。这是一个好主意吗?这种方法的优点/缺点是什么?我还需要考虑其他选择吗?
底线:我正在尝试模仿多线程。任何竞争条件都将通过代码处理(例如在 DB 中设置状态等)。脚本应该执行处理密集型任务(例如创建缩略图等)。
【问题讨论】:
标签: php multithreading concurrency cron
我有一些脚本需要作为单独的进程同时运行。我的计划是有一个 cron 作业,以设定的时间间隔执行这些脚本的多个实例。这是一个好主意吗?这种方法的优点/缺点是什么?我还需要考虑其他选择吗?
底线:我正在尝试模仿多线程。任何竞争条件都将通过代码处理(例如在 DB 中设置状态等)。脚本应该执行处理密集型任务(例如创建缩略图等)。
【问题讨论】:
标签: php multithreading concurrency cron
您可以使用分叉。启动脚本将加载所有默认配置和初始化,然后派生子进程进行处理。然后它可以监视进程以查看它们是否仍在运行。 http://php.net/manual/en/function.pcntl-fork.php
【讨论】:
好吧,如果您需要它作为 cronjob,请继续。如果您需要多个进程,您很可能希望使用pcntl_fork 来创建同一脚本的多个实例。
【讨论】:
根据您希望以多快的速度对这些工作做出反应,以及您是否希望执行处理器密集型任务,那么您还可以使用排队系统分散该处理。如果您有多个内核/处理器,请查看 Gearman 或 beanstalkd,每台机器有多个工作人员。
【讨论】:
PHP 没有fork() 吗?虽然这不是真正的多线程,但它是协同程序的一种基本方式。
【讨论】:
使用 cron 的一个缺点是它会以您设置的时间间隔执行脚本的副本,而不管已经运行了多少脚本进程。这意味着脚本需要一种相互通信的方式,以便最多同时运行 N 个脚本(多余的脚本可以立即退出)。
cron 的替代方案可能是 supervisord,它将执行可配置数量的脚本并监视每个脚本,以便重新生成任何退出。
【讨论】: