我有一个使用Celery / RabbitMQ在linux上运行的应用程序,设置正常。
但是现在我必须开发一些新功能,我可用的开发机器是没有管理员权限的Windows7,所以我无法安装Rabbit或Redis服务器。
有一些方法可以模仿这个,所以我可以在我的Windows机器上执行这个应用程序(Flask)吗?
提前致谢!
答案 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,但结果已被评估。
也就是说,任务将在本地执行而不是发送给 队列中。