我确实有一个使用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
这样的其他任务函数没有实现,但可以完成。
我认为这不是一个好的解决方案,但暂时解决了我的问题。任何其他解决方案都会很好。