Celery:轮询运行任务以获得结果

时间:2015-10-13 03:24:14

标签: python select celery polling epoll

凸出/

celery.py

from __future__ import absolute_import

from kombu import Exchange, Queue
from celery import Celery

app = Celery('proj',
             broker='redis://myredis.com',
             backend='redis://myredis.com',
             include=['proj.tasks'])

a_exchange = Exchange('a_ex', type='topic')

# Optional configuration, see the application user guide.
app.conf.update(
    CELERY_TASK_RESULT_EXPIRES=3600,
    CELERY_DISABLE_RATE_LIMITS=True,
    CELERY_ROUTES = {"app.tasks.timeme": "a"}
)

if __name__ == '__main__':
    app.start()

tasks.py

from __future__ import absolute_import

from proj.celery import app
import time

@app.task
def timeme(ts):
    print 'hi'
    lat = time.time() - float(ts)
    return (lat, time.time())

do_tasks.py

import proj.tasks
import time
import sys

stime = time.time()
running = []
while time.time() < stime + 15:
    res = proj.tasks.timeme.apply_async(args=[time.time()], link=proj.tasks.timeme.s())
    running.append(res)

    for res in running:      #<------------ this gets extremely slow if running gets big!
          if res.ready()
              print res.get()

在上面的代码中,循环running并查看它是否已经为结果做好准备需要很长时间,因为running变得越来越大。

在运行芹菜任务时是否有类似select.selectpoll/epoll的内容?

所以我可以做以下事情:

While running:
    read, w, e = select.select([running], [], [])
    print read.get()
    running.remove(read)
    break

1 个答案:

答案 0 :(得分:2)

总之,没有。

但是,您可以使用celery.app.control.inspect

获得所需内容
i = app.control.inspect()
i.active()
[{'worker1.example.com':
    [{'name': 'tasks.sleeptask',
      'id': '32666e9b-809c-41fa-8e93-5ae0c80afbbf',
      'args': '(8,)',
      'kwargs': '{}'}]}]