我读了很多关于队列的文章,对此感到困惑。如果我理解正确的话,我会记下我所知道的,请告诉我。
队列基本上可以帮助您在请求-响应周期之外完成任务。也就是说,如果客户端上传了一张图像,而你想保存图像的缩略图版本,你不想让客户端等待图像被修剪,然后返回他,你可以通过队列在请求-响应周期之外完成。队列几乎像传统的数据结构队列,是先进先出的类型。
这些队列的流行解决方案提供商是芹菜、pyres和&亚马逊广场。
队列是如何工作的
通常会有一个守护进程在运行,例如,如果有芹菜,那么就会有一个芹菜守护进程运行,并继续对队列顶部的任何任务进行计算。(希望我是对的)
再举一个稍微复杂的例子,请纠正我的错误。
现在说我想自动化以下任务:
-
12月25日,给我的一个朋友发邮件
-
祝朋友12月26日生日快乐
-
祝另一位朋友12月26日生日快乐
在这种情况下,我将做以下操作:
-
创建一个条目,并在数据库中。
-
创建条目后,对该条目进行排队。
-
解雇一名将执行该任务的工人。
现在有一个疑问,第三步正确吗?
是否有一个长期的投票工作人员,将采取行动?这是怎么回事?我很困惑。或者我需要有一个运行的cron作业,它将继续激发脚本要检查队列中是否有任何东西,在给定的时间内(精确到分钟),如果有,则解雇一名员工。
当你查看芹菜的文档时,它们需要一个后端-redis、mongodb、sqs等。因此,如果我是对的,将会有一个连续的进程作为守护进程运行,并跟踪队列中的事情(redis、mongodb),并且应该执行。这是灰色区域。请帮忙。
谢谢你的回答。
使用Celery有两种基本方法。假设您使用的是Celery+Rabbitmq
-
执行长时间运行的任务(>您不想让客户端等待工作完成。)您可以从web请求中执行的代码中运行芹菜任务。这意味着您的任务将被序列化为消息,并将被发送到rabbit服务器上的队列。其他进程(Celery进程)有一个使用者,当消息到达队列时,该使用者将被初始化。Celery worker获取这些消息,对其进行反序列化,并在其他线程中执行您的任务。仅此而已。
-
您可以通过cron启动您的Celery作业(它只是更改为Celery创建任务的发件人,但所有其他事情都是一样的)
p.s.如果您使用的不是RabbitMq,比如Database,Memcached作为Broker。Celery将每N秒或毫秒读取一次。等等