没有MQ的Windows上的Celery

时间:2014-10-23 21:49:39

标签: windows celery

我有一个使用Celery / RabbitMQ在linux上运行的应用程序,设置正常。

但是现在我必须开发一些新功能,我可用的开发机器是没有管理员权限的Windows7,所以我无法安装Rabbit或Redis服务器。

有一些方法可以模仿这个,所以我可以在我的Windows机器上执行这个应用程序(Flask)吗?

提前致谢!

2 个答案:

答案 0 :(得分:0)

我不想回答我自己的问题,但是如果有人在寻找一种方法来模仿芹菜的存在时发现了这个问题,那么我就是这样做的:

由于我正在使用Flask,我已经有一个修改后的芹菜类来共享上下文,现在我需要第二个make_celery函数来使用我需要仿真。

if usefake == True:
    #this is a fake task! actualy task will run in same thread of caller
    def make_celery(app):
        class FakeCelery(object):
            def task(self, func):
                class FakeTask(object):
                    def __init__(self, f):
                        self.f = f
                    def delay(self, *args, **kwargs):
                        return self.f(*args, **kwargs)
                return FakeTask(func)
        return FakeCelery()
else:
    #this is the production maker which share the context with the task
    def make_celery(app):
        celery = Celery(app.import_name, broker=app.config['CELERY_BROKER_URL'])
        celery.conf.update(app.config)
        TaskBase = celery.Task
        class ContextTask(TaskBase):
            abstract = True
            def __call__(self, *args, **kwargs):
                with app.app_context():
                    return TaskBase.__call__(self, *args, **kwargs)
        celery.Task = ContextTask
        return celery

celery = make_celery(app)

两者具有相同的用法:

@celery.task
def mytask(a, b):
    return a+b

mytask.delay(1, 2)

正如您所看到的,我始终只使用delay,因此其他任务函数如get未实现但可以完成。

我不认为这是一个很好的解决方案,但现在解决了我的问题。任何其他解决方案都会很好。

答案 1 :(得分:0)

您可以设置CELERY_ALWAYS_EAGER

  

如果这是True,则所有任务将通过阻塞直到本地执行   任务返回。 apply_async()和Task.delay()将返回一个   EagerResult实例,它模拟API和行为   AsyncResult,但结果已被评估。

     

也就是说,任务将在本地执行而不是发送给   队列中。