2013-04-08 2 views
5

Plone 4の使用時に、サブスクライバイベントが正常に作成され、カスタムコンテンツタイプが保存されたときに特別な処理が行われました。これは私がインターフェイスを使って達成しました。Ploneサブスクライバイベントを非同期で実行する

の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 

バックグラウンドで実行する方法がある場合は、余分な処理は時々時間がかかりすぎることができます、と私は思っていましたすなわち非同期に行われる。

たとえば、オブジェクトを保存しているときなどにサブスクライバイベントを非同期で実行できますか?

答えて

6

出荷時の状態ではありません。あなたの環境にasynchサポートを追加する必要があります。

plone.app.asyncをご覧ください。 ZEO環境と少なくとも1つの余分なインスタンスが必要です。後者は、サイトからキューにプッシュする非同期ジョブを実行します。

非同期に実行するメソッドを定義し、タスクをキューにプッシュして、そのようなメソッドを非同期に実行することができます。

例コード、キューにタスクをプッシュ:

from plone.app.async.interfaces import IAsyncService 

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

とタスク自体:someobjectはあなたのZODBで永続オブジェクトである

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

IAsyncService.queueJobは、と少なくともの関数とコンテキストオブジェクトを受け取りますが、タスクを実行するのに必要な数の引数を追加できます。引数はpickleableでなければなりません。

タスクは、非同期ワーカーインスタンスによって現在の要求のコンテキスト外で実行されます。

1

さらに多くのオプションを与えるには、実際にはシンプルで本当に強力な(とplone.app.asyncの欠点を避けるために)collective.taskqueueを試してみてください。

PyPIの説明には、すでに時間をかけずに高速化するのに十分なだけでなく、キュー管理のためにredisを使うことができます。これは大きなプラスです。

関連する問題