2016-03-19 3 views
0

Celeryを使用してDjangoモデルインスタンスをサードパーティのSOAPサービスにプッシュ(プル)するDjango + Celeryアプリケーションがあります。Pythonのタスクのためのセロリキューの検査

class MyModel(Models): 
    def get_dependencies(self): 
     # ... 
     return [...] 

    def __hash__(self): 
     return hash(self.__class__.__name__+str(self.pk)) 

は、このハッシュは、私は安定性の問題が原因でドロップしなければならなかった私の独自の実装に便利になった:

私のDjangoのモデルはまた、それらの間の依存関係と、このような単純なハッシュを持っています。セロリははるかに高い地面です。

インスタンスをSOAPサービスにプッシュするとき、その依存関係がプッシュされていることを確認する必要があります。これは、すべての関連するインスタンスをチェックして、pushed_okのタイムスタンプフィールドを確認することによって行われます。

インスタンス(すべてがMyModelサブクラスのインスタンス)のリストに依存するインスタンスaがプッシュされているときに難しい部分です。 depsのすべてのインスタンスがCeleryによって処理されていない限り、aをプッシュすることはできません。言い換えれば、依存関係の順序が尊重されるようにタスクをシリアライズする必要があります。

セロリは、このように実行されます。私はその依存関係の前にaを実行しているからeventlets(/プロセス/スレッド)のいずれかを防ぐことができます

celery -A server worker -P eventlet -c 100 

どのように、もしあれば、他のeventletsによって実行されて終了しましたか?

ありがとうございました。

答えて

0

セロリのタスク内で、リソースの依存関係のチェック(つまり、非同期の依存関係をSoapサーバーにプッシュすることを含む)をすべて実行するという現実的な解決策を検討しました。リソースの依存関係に応じてタスクを直列化しようとするのではなく、

アップサイドは、それを簡単に保ち、私はそれを迅速に実装できるということです。

欠点は、従業員をロックして、これらの操作をワーカー全体にディスパッチするのではなく、潜在的に多くの同期SOAP操作をロックすることです。

関連する問題