不带MQ的Windows上的Celery



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

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

有什么方法可以模仿它,这样我就可以在我的windows机器上执行这个应用程序(顺便说一下Flask)了?

提前感谢!

您可以设置CELERY_ALWAY_EAGER:

如果为True,则所有任务都将通过阻塞在本地执行,直到任务返回。apply_async()和Task.delay()将返回EagleResult实例,该实例模拟API和AsyncResult,但已计算结果。

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

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

由于我使用的是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这样的其他任务函数没有实现,但可以完成。

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

相关内容

  • 没有找到相关文章

最新更新