我将尽力回答尽可能多的问题。
这可以(并且应该)使用芹菜来完成吗?
是的你可以
我正在使用 django。我应该尝试使用 django-celery 而不是普通芹菜吗?
Django 对 celery 有很好的支持,可以让开发过程变得更加轻松
这些任务中的每一项都可能衍生出其他任务 - 例如日志记录
刚刚发生了什么或其他类型的分支。这可能吗?
您可以使用ignore_result = true从任务中启动子任务,仅产生副作用
任务是否可以返回他们获得的数据 - 即可能是 Kb 的数据
通过 celery 获取数据(本例中以 redis 为基础)或者应该
写入数据库,然后只传递指向该数据的指针?
我建议将结果放入数据库,然后传递 id 会让您的经纪人和工作人员感到高兴。减少数据传输/酸洗等。
每个任务主要受 I/O 限制,最初只是要使用
来自网络线程的 gevent 以扇出请求并跳过整个请求
排队设计,但事实证明它会被重用
不同的组件。试图保持整个往返行程
Qs 实时可能需要许多工作人员来确保
队列大多是空的。或者是吗?会运行 gevent 工作线程
泳池帮忙解决这个问题吗?
由于进程是 io 绑定的,那么 gevent 肯定会在这里提供帮助。然而,gevent pool'd worker 的并发性应该是多少,这也是我正在寻找答案的问题。
我是否必须编写 gevent 特定任务或将使用 gevent 池
自动处理网络IO?
当您在池中使用 Gevent 时,它会自动进行猴子修补。但是您使用的库应该能够与 gevent 很好地配合。否则,如果您使用 simplejson (用 c 编写)解析一些数据,那么这将阻止其他 gevent greenlet。
是否可以为某些任务分配优先级?
您不能为某些任务分配特定的优先级,而是将它们路由到不同的队列,然后让不同数量的工作人员监听这些队列。特定队列的工作人员越多,该队列上任务的优先级就越高。
让它们保持秩序怎么样?
连锁是维持秩序的一种方式。和弦是一个很好的总结方式。 Celery 会照顾它,所以你不必担心。即使使用 gevent 池,最终也可以推断任务执行的顺序。
我应该跳过芹菜而只使用昆布吗?
如果您的用例不会随着时间的推移而变得更复杂,并且您愿意自己通过 celeryd +supervisord 管理您的流程,那么您可以。另外,如果你不关心celerymon、flower等工具自带的任务监控。
芹菜似乎更适合“任务”,可以
延迟且对时间不敏感。
Celery 也支持计划任务。如果这就是你那句话的意思。
我为了保持实时性而疯了吗?
我不这么认为。只要你的消费者足够快,它就会像实时一样好。
我还应该关注哪些其他技术?
对于芹菜,您应该明智地选择结果存储。我的建议是使用 cassandra。它对于实时数据(写入和查询方面)都有好处。您还可以使用 redis 或 mongodb。他们在结果存储方面有自己的一系列问题。但配置上的一些调整可能会大有帮助。
如果您的意思与 celery 完全不同,那么您可以研究 asyncio (python3.5) 和 Zeromq 来实现相同的目的。但我无法对此发表更多评论。