2013-04-08 15 views
5

Przy użyciu Plone 4 pomyślnie utworzyłem zdarzenie subskrybenta, aby wykonać dodatkowe przetwarzanie po zapisaniu niestandardowego typu zawartości. Osiągnąłem to dzięki interfejsowi Products.Archetypes.interfaces.IObjectInitializedEvent.Uruchamianie zdarzeń subskrybenta Plone asynchronicznie

configure.zcml

<subscriber 
     for="mycustom.product.interfaces.IRepositoryItem 
      Products.Archetypes.interfaces.IObjectInitializedEvent" 
     handler=".subscribers.notifyCreatedRepositoryItem" 
    /> 

subscribers.py

def notifyCreatedRepositoryItem(repositoryitem, event): 
    """ 
    This gets called on IObjectInitializedEvent - which occurs when a new object is created. 
    """ 
    my custom processing goes here. Should be asynchronous 

Jednak dodatkowa obróbka może czasami trwać zbyt długo, a ja zastanawiałem się, czy istnieje sposób, aby uruchomić go w tle tj. asynchronicznie.

Czy można uruchamiać zdarzenia abonenckie asynchronicznie, na przykład podczas zapisywania obiektu?

Odpowiedz

6

Nie po wyjęciu z pudełka. Musisz dodać obsługę asynch do swojego środowiska.

Spójrz na plone.app.async; będziesz potrzebować środowiska ZEO i co najmniej jednej dodatkowej instancji. Ta ostatnia uruchomi asynchroniczne zadania, które wepchniesz do kolejki ze swojej witryny.

Następnie można zdefiniować metody, które mają być wykonywane asynchronicznie, i przekazać zadania do kolejki, aby wykonać taką metodę asynchronicznie.

Przykładowy kod, wciśnij zadanie do kolejki:

from plone.app.async.interfaces import IAsyncService 

async = getUtility(IAsyncService) 
async.queueJob(an_async_task, someobject, arg1_value, arg2_value) 

i zadanie sobie;

def an_async_task(someobject, arg1, arg2): 
    # do something with someobject 

gdzie someobject jest trwały obiekt w ZODB. Obiekt IAsyncService.queueJob przyjmuje co najmniejfunkcję i obiekt kontekstu, ale można dodać tyle dalszych argumentów, ile potrzeba do wykonania zadania. Argumenty muszą być godne pochwały.

Zadanie zostanie następnie wykonane przez instancję pracownika asynchronicznego, gdy będzie mogła, poza kontekstem bieżącego żądania.

1

Aby podać więcej opcji, możesz wypróbować na tym collective.taskqueue, naprawdę proste i naprawdę potężne (i uniknąć niektórych wad plone.app.async).

Opis na PyPI już wystarcza, aby przyspieszyć działanie w krótkim czasie, a do zarządzania koleją można użyć opcji redis, co jest dużym plusem.