php怎么调用celery任务

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php怎么调用celery任务相关的知识,希望对你有一定的参考价值。

参考技术A 任务队列是一个将工作分布到多线程或多台机器上的机制。
一个任务队列的输入是一个工作单元也被称为任务。专用的工作者进程将会持续监控任务队列并执行它们。
Celery通过消息进行通信,通常通过一个中间人在客户端和工作者之间协调。客户端初始化一个任务并将它加到任务队列,中间人将其发送到工作者。
一个Celery系统可以由多个工作者和中间人构成,这为高可用性和横向扩展提供了便利。
Celery是用python语言实现的,但是可以使用任何语言实现其协议。除了python以外,还有node.js实现的node-celery和一个php实现的客户端。
node-celery for Node.js, and a PHP client.

不同语言之间可以相互操作,通过使用webhooks.using webhooks.
参考技术B 简单的使用 time.sleep() 复杂点的 使用 APScheduler 再复杂的 使用 Celery RabbitMQ

调用子进程的 celery 任务的 CPU 并发行为

【中文标题】调用子进程的 celery 任务的 CPU 并发行为【英文标题】:CPU Concurrency behavior with celery task that calls a subprocess 【发布时间】:2014-06-26 11:26:35 【问题描述】:

我有一个 celery 任务,它使用 subprocess.Popen() 调用可执行一些 CPU 密集型数据处理的可执行文件。它运行良好,但没有充分利用 celery worker 的并发性。

如果我用--concurrency 8 -P prefork 启动celeryd,我可以用ps aux | grep celeryd 确认已经产生了8 个子进程。好的。

现在当我开始时,例如并行执行 3 个任务,我看到其中一名童工完成了所有三个任务: [2014-05-08 13:41:23,839: WARNING/Worker-2] running task a... [2014-05-08 13:41:23,839: WARNING/Worker-4] running task b... [2014-05-08 13:41:24,661: WARNING/Worker-7] running task c...

... 在成功完成之前它们会运行几分钟。但是,当您观察那段时间的 CPU 使用率时,很明显,尽管有另一个空闲内核,但所有三个任务都共享同一个 CPU:

如果我再添加两个任务,每个子进程会占用该 CPU 的约 20%,以此类推。

我希望每个 celery 子进程(通过 prefork 方法使用multiprocessing.Pool 创建)能够独立运行,而不受限于单个核心。如果没有,我如何在 CPU 密集型 celery 任务中充分利用多个 CPU 内核?

【问题讨论】:

【参考方案1】:

根据

http://bugs.python.org/issue17038 和 https://***.com/a/15641148/519385

存在一个问题,即某些 C 扩展与核心关联性混淆,并阻止多处理访问所有可用的 CPU。该解决方案是一个彻底的黑客,但似乎工作。

os.system("taskset -p 0xff %d" % os.getpid())

【讨论】:

以上是关于php怎么调用celery任务的主要内容,如果未能解决你的问题,请参考以下文章

在没有工人的情况下运行 celery 任务

如何使用 celery 守护进程调用 celery 任务

python3+celery+redis实现异步任务

如何设置 Celery 在运行任务之前调用自定义初始化函数?

Celery第一步

RuntimeError:永远不要在任务 Celery 中调用 result.get()