0

私はトルネードでプッシュシステムを開発していました。長いポーリングを行っているため、後で結果を設定するために、Future オブジェクトのリストを保持する必要があります。次に、Future リストを Redis に保持したいので、Pickle モジュールを使用して各 Future を「ダンプ」し、Redis に設定しますが、Redis から取得した後、「ロード」します。元の Future オブジェクトではないことがわかりました。この Future オブジェクトで set_result 関数を呼び出すと、期待どおりに動作しません。

誰でもこれについて私を助けることができますか?

これは私のコードの一部です:

@singleton
class MessageProxy:

    def register_subscriber(self, subscriber):
        r.set("subscriber", pickle.dumps(subscriber))

    def send_message(self, message):
        subscriber = pickle.loads(r.get("subscriber"))
        subscriber.set_result(message.content)
4

1 に答える 1

0

Futureオブジェクトは有効にピクルできません。unfinishedFutureは、コールバックのリストを含む単なるプレースホルダーであり、コールバックをピクルすることはできません。(さらに、コールバックのリストはいつでも変更できます。pickle.dumps()例外なく呼び出すことができるということは、それを行うのが早すぎることを意味します。アプリケーションはまだコールバックをアタッチする機会がありません)。

redisに格納する代わりにFutures、マップをメモリに保持し、識別子を redis に格納する必要があります。複数のサーバー プロセスがある場合は、当然、これらのマップが複数存在します。すべてのメッセージをすべてのサーバーにブロードキャストする (誰が何を聞いているかを知らずに) か、ある種のアドレス指定情報を redis に含めることによって、メッセージが必要な場所に確実に届くようにする必要があります。

于 2015-03-25T13:53:51.020 に答える