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任务的主要内容,如果未能解决你的问题,请参考以下文章