Eri*_*aal 19 python queue celery flask python-huey
我们在Windows下的IIS下运行Flask站点,对于进程外任务,我们使用Celery.Celery在Windows下给了我们一些问题,但是现在我们很满意运行版本3.1.12,使用RabbitMQ/AMQP作为后端,它可以在Windows下运行.
新版Celery(4)已经放弃了对Windows的支持,所以我正在寻找一种可行的替代方案.
RQ似乎是一个非常好的任务队列,但它也不支持Windows(页面底部)
我已经看到了一些看起来不太受欢迎的任务队列,例如:
但目前还不清楚这些是否支持Windows和Flask.我想知道是否有人有经验在Windows下运行Python任务队列的经验.也许我提到的那个之一,或者另类.
我们不能选择运行Linux机器,因为我们没有管理Linux的经验,而且我们有许多需要Windows运行的遗留内容.
pjc*_*ham 11
我在Windows上运行带有Huey的Flask没有任何问题,不可否认只是用于开发和测试.为了生产,我在Linux服务器上使用Flask/Huey.两者都是Redis后端,Flask 0.12和Huey 1.2.0.
我使用工厂模式创建Flask应用程序的专用"减少"版本,供Huey任务特定使用.此版本不加载蓝图或配置Flask-Admin,因为Huey任务中不需要这些.
__init__.py在app文件夹中的示例代码.App是一个从Flask以下类扩展的类:
def create_app(settings_override=None):
app = App('app')
if settings_override:
app.config.from_object(settings_override)
else:
app.config.from_object(os.environ['APP_SETTINGS'])
from .ext import configure_extensions
configure_extensions(app, admin, load_modules=True)
# REST
import rest.api_v1
app.register_blueprint(api_v1_bp, url_prefix='/api/v1')
# ... and more suff
def create_huey_app():
app = App('huey app')
app.config.from_object(os.environ['APP_SETTINGS'])
from .ext import configure_extensions
configure_extensions(app, admin=None, load_modules=False)
return app
Run Code Online (Sandbox Code Playgroud)
这个想法configure_extensions取自Quokka CMS.检查它app __init__.py及其扩展模块,看看它是如何实现的.另请注意,此项目如何创建create_celery_app用于Celery任务队列的特定app().
例子tasks.py.请注意使用with app.app_context():创建Flask上下文.现在我的函数可以访问扩展名,如Flask-Mail,Flask-SqlAlchemy(db,models)等.
@huey.task()
def generate_transaction_documents_and_email(transaction_id):
app = create_huey_app()
with app.app_context():
reports.generate_transaction_documents_and_email(transaction_id)
@huey.task()
def send_email(subject, recipients, text_body, html_body, attachments=[], cc=[]):
app = create_huey_app()
with app.app_context():
emails.send_email(subject, recipients, text_body, html_body, attachments, cc)
@huey.periodic_task(crontab(minute='30'))
def synchronize_mailing_list():
app = create_huey_app()
if app.config['CREATESEND_SYNCHRONIZE']:
_list_name = app.config['CREATESEND_LIST']
with app.app_context():
sync_delete_ar_subscribers(_list_name)
sync_add_ar_subscribers(_list_name)
Run Code Online (Sandbox Code Playgroud)