2017-02-20 95 views
10

Prowadzimy witrynę Flask w IIS na Windowsie, a dla zadań pozaprocesowych używamy Seler. Seler dał nam pewne problemy w systemie Windows, ale na razie jesteśmy zadowoleni z wersji 3.1.12, wykorzystując RabbitMQ/AMQP jako back-end, który działa pod Windows.Jaka jest najlepsza opcja dla kolejki zadań (Python 3) w systemie Windows teraz, gdy Seler 4 zepsuł obsługę systemu Windows?

Nowa wersja Selera (4) ma dropped support for Windows, więc szukam realnej alternatywy.

RQ wydaje się bardzo ładny kolejkę zadań, ale również nie obsługuje systemu Windows (bottom of the page)

Widziałem kilka, z pozoru mniej popularne kolejki zadań jak:

Ale nie jest jasne, czy te obsługują Windows i Flask. Zastanawiam się, czy ktoś ma doświadczenie w uruchamianiu kolejki zadań Pythona w systemie Windows, która działa. Może jeden z tych, o których wspomniałem, lub alternatywa.

To nie jest opcja dla nas, aby uruchomić maszynę Linux, ponieważ nie mamy doświadczenia w administrowaniu Linuksem, a my mamy wiele starszych rzeczy, które wymagają systemu Windows.

+0

Czy kiedykolwiek znalazłeś? Szukałem go przez ostatnie 2 tygodnie i nie mogę znaleźć takiego, które jest jeszcze rozwinięte. –

+0

@KevinVasko; Huey jest najczęściej używanym narzędziem. Eksperymentowałem z nią i jest to proste i działa. Jednak znalazłem jeden duży problem, a autor nie mógł mi w tym pomóc; Nie mogę używać pracowników Huey, którzy potrzebują kontekstu Flask. Nie mogę wymyślić, jak przekazać zadania w tym kontekście. To powstrzymuje mnie obecnie przy użyciu Huey. –

+0

Dzięki za opinie, sprawdzę Huey, nie będę musiał pracować z Flask, więc mam nadzieję, że to nie będzie problem.Znalazłem również jeden o nazwie "WorQ", ale nie był aktualizowany od 3 lat i nie jest jasne, czy obsługuje system Windows, czy nie. –

Odpowiedz

6

Uruchomię Flask z Huey na Windowsie bez żadnych problemów, wprawdzie tylko do programowania i testowania. Do produkcji używam Flask/Huey na serwerach Linux. Zarówno z back-endem Redis, Flask 0.12 i Huey 1.2.0.

Używam wzoru fabrycznego, aby utworzyć wyspecjalizowaną "wyciętą" wersję aplikacji Flask do określonego użytku przez zadania Huey. Ta wersja nie ładuje schematów lub nie konfiguruje Flask-Admin, ponieważ nie są one wymagane w zadaniach Huey.

Przykładowy kod __init__.py w folderze aplikacji. App jest klasą rozciągający się od 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 

Pomysł configure_extensions pochodzi z Quokka CMS. Sprawdź jego app__init__.py i jego extensions module, aby zobaczyć, w jaki sposób jest to realizowane. Zwróć także uwagę, w jaki sposób ten projekt tworzy również konkretną aplikację (create_celery_app) do użytku z kolejką zadań Seler.

Przykład . Zwróć uwagę na użycie with app.app_context():, aby utworzyć kontekst Flask. Teraz moje funkcje mają dostęp do rozszerzeń, takich jak Flask-Mail, Flask-SqlAlchemy (db, modele) itp.

@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) 
+0

Dziękuję za te informacje; Postaram się to dla siebie przygotować i wrócić do tego pytania. –

+0

Wdrażam to, ale nie jestem pewien, co robisz wewnątrz importu configure_extensions. Czy myślisz, że dzielisz się tym, co się tam dzieje? –

+0

@RicoSuave Zaktualizowałem swoją odpowiedź. – pjcunningham