問題タブ [distributed-objects]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
cocoa - Cocoa 分散オブジェクト、GC クライアント、非 GC サーバー
2 つの Cocoa プロセスがあり、分散オブジェクト (DO) と通信するセットアップがあります。クライアントはガベージ コレクションを使用していますが、サーバーは使用していません。
クライアントは、私の直接参照の外側にある遠くのオブジェクトにしがみついているようです。これは、オブジェクトへの参照がなくなった後でも、オブジェクトは NSDistantObjectTableEntry によって所有されていることを意味します。明らかに、それらはサーバー上で割り当て解除されません。
クライアントが終了したときにのみ、離れたすべてのオブジェクトを手放します。接続を手動で切断することもおそらくうまくいくでしょうが、クライアントの実行中にはそうしたくありません。
ローカルで参照されなくなった遠いオブジェクトを手放すように GC された DO クライアントに指示する方法はありますか?
objective-c - Cocoa 分散オブジェクト、ロング ポーリング、launchd、およびアクティビティ モニターでの「応答なし」
シナリオ:
Mac アプリケーションと launchd デーモン (Foundation クラスで作成) の間に分散オブジェクトベースの IPC があります。非同期メッセージングに関して以前に問題があったため (たとえば、サーバーのルート オブジェクトに registerClient: があり、サーバーのルート オブジェクトがクライアントのプロキシ オブジェクトのメソッドを通知/呼び出しするイベントがあるときはいつでも)、ロング ポーリングを行いました。クライアントは、デーモンからのイベント/通知のリストを「収集」します。この「収集」は、サーバー オブジェクト メソッド呼び出しによって行われ、NSArray インスタンスが返されます。
数秒間、サーバー オブジェクトのプロセス (launchd を介して起動された) の横に "(応答なし)" タグが付けられた赤いラベルが付けられます (アクティビティ モニター内)。私が言ったように、機能的にはうまく機能しますが、この「応答なし」ラベルを取り除きたいだけです。
この「応答なし」タグを防ぐにはどうすればよいですか?
参考までに、以前にlaunchdベースのプロセスを実行しましたが、ロングポーリングを実行したのはこれが初めてです。また、NSSocketPortNameServer ベースの接続と NSSocketPort ベースの接続も試しました。彼らにはこの問題はありませんでした。ロックも問題ではありませんでした。使用されているロックは NSCondition だけのものであり、プログラムをログに記録してデバッグしたところ、ロックの「問題」はハーベスティング部分だけであり、実際には機能的に機能しているようです。また、クライアント プロセスは PyObjC で記述され、サーバー プロセスは ObjC で記述されます。
前もって感謝します。
cocoa - 分散オブジェクトを使用したオブジェクトの販売とアクセスの同期
アプリケーションで分散オブジェクトを使用して、小さな認証エージェント プログラムとメイン アプリケーション間の通信を提供しています。メイン アプリケーションは NSTask を生成します。NSTask は認証プログラムを起動し、認証プログラムはメイン プログラムにコールバックしてユーザー資格情報を取得します。複雑に聞こえるかもしれませんが、ssh が SSH_ASKPATH 内のプログラムからパスワードを取得する方法があるため、このように動作する必要があります。
私のメイン アプリケーションには、PasswordDialog というオブジェクトのインスタンスが 1 つあります。これを次のように販売します。
これは、アプリケーションの起動時に 1 回発生します。
認証エージェントでは、次のようにこのオブジェクトにコールバックします。
問題は、これが私が望むように機能しないことです。複数の認証エージェントが同時に実行されている場合、それらはすべて同じオブジェクトにアクセスし、同じメソッドを同時に呼び出すことができます。たとえば、「responseForPID」の先頭にログ ステートメントを配置すると、最後に次のような出力が得られます。
同じアドレスを持つオブジェクトの同じスレッドで、私のメソッドに 3 つの異なるプロセスが入っているようです。明らかに、ここでは分散オブジェクトとスレッドの基本的な理解が欠けていますが、それは魔法のように思えますか?
だから最終的に私は私の質問に行きます
(a) 誰かがここで何が起こっているのか説明できますか (つまり、上記のログステートメントを取得する方法)
(b) 明らかに、目的のために分散オブジェクトを間違って使用しています。誰かが私がそれを正しく行う方法を提案できますか?
この質問を最後まで読んでくれてありがとう!
編集:明確にするために。私の「responseForPID」メソッドは次のようになります。
objective-c - Cocoa 分散オブジェクト
この Distributed Objects のデモを実行する方法を理解しようとして頭が痛くなりました。同じマシンでローカルに問題なく実行できます。
これが状況です。リモート マシンで [OpenGLView を使用して] クライアント アプリを生成するサーバー アプリがあります。
これは AppleScript で簡単に行うことができます。
クライアント アプリは、OpenGLView ウィンドウの [OK] を提供しているようです:
サーバー アプリはポートと接続を見つけますが、タイムアウト例外を発生させます。
そして、私は一生、理由を理解できません。
クライアント PC のコンソールに「Port OK」「Conn OK」「Port 8081: Vend OK」と表示されます。
サーバー PC のコンソールに入る: "Port OK" "Conn OK" 11/18/09 2:05:36 PM DOTest3[15278] [NSPortCoder sendBeforeTime:sendReplyPort:] timed out (10280263936.092180 280263936.092642) 1
TimeOuts が両方とも 60 秒に設定されている場合でも。
ヘルプ!
-スティーブン
サーバー: MacMini OS X 10.5 クライアント: MacPro OS X 10.6 リモート ログイン、管理などはすべて有効です。
編集: NSResponder の提案を受けて、コントローラーを販売しましたが、まだ機能していません。
クライアント/ベンダー:
クライアント コントローラー:
サーバーコントローラー:
サーバー/(販売されたオブジェクトを取得)
はあ…ここで本当にカカオの基本的なものを見落としているだけだと確信しています。
-S!
objective-c - 複数のクライアントを持つ Obj-C サーバー
私はかなり初心者の obj-c 開発者で、クライアントとサーバーの関係をセットアップする方法について質問があります。私は (主に趣味で) 友人や家族と一緒にインターネット上で遊べるボード ゲームをデザインしています (モノポリーと考えてください)。私の問題: 適切なクライアントとサーバーの関係をセットアップして、1 つのサーバーに複数のクライアントを配置するにはどうすればよいですか?
私が考えたのは、1 つのサーバーにゲームの状態に関するすべての情報を格納し、Cocoa の優れた分散オブジェクト フレームワークを通じてさまざまなオブジェクトに適切なメッセージを送信することでした。ただし、1 つのサーバーで複数のクライアントを受け入れる方法がわかりません。
しかし、その後は?クライアントが接続されているときに実行ループを停止するように指示する方法はありますか? 可能であればマルチスレッドは避けたいと思います。それは、学ぶのがまったく新しい複雑さであり、このプロジェクトはすでに十分に挑戦的です!
どんな助けでも大歓迎です。必要に応じて、何かを明確にしていただければ幸いです。
前もって感謝します。
objective-c - NSConnectionを介した同期分散オブジェクトの問題
Webからデータを取得して解析し、検索インターフェイスで結果をコンパイルするアプリケーションがあります。データは相互依存していないため、アプリケーションをマルチスレッド化して、複数のフェッチと解析を同時に実行することは理にかなっています。この関数を実行するために作成した検索および解析オブジェクトでNSInvocationOperationを使用します。
コントローラオブジェクトには、次のメソッドがあります。
アプリケーションはコアデータに依存していますが、私が収集したものはほとんどスレッドセーフではありません。検索/解析操作ごとに(およびコントローラー用に)異なるNSManagedObjectContextがあり、操作間またはプロキシオブジェクト間でのみNSManagedObjectIdを渡します。
操作は、完了した解析結果をNSConnectionオブジェクトを介してコントローラーに戻します。コントローラは、NSMachPortオブジェクトを使用してNSConnectionを構築し、それ自体をルートオブジェクトとして設定し、NSInvocationOperationsの各ターゲットに同じNSConnectionオブジェクトを提供します。次に、コントローラーは、NSInvocationOperationをエンキューして、独自のNSOperationQueueで実行します。
検索スレッダーオブジェクトには、次のメソッドがあります。
ここに示した一般的なスレッド間通信のAppleの例に従ったと思います。
ほとんどの場合、これは美しく機能します。NSConnectionrootProxyからの通知は、期待どおりにメインスレッドの実行ループに送信され、コントローラーオブジェクトの準備ができるまでピックアップを待ちます。ただし、一部のテストケースでは、rootProxyオブジェクトを呼び出しているNSInvocationOperationオブジェクトと同じスレッドのコントローラーオブジェクトにメッセージが届くことがあるため、CoreDataが急停止します。
検索/解析操作が完了したときに送信されるメッセージのコントローラーにデバッガーポイントを配置しました。確かに、実行中のスレッドがメインスレッドではない場合もあります。なぜこれが起こるのかについて誰かが考えていますか?または、スレッド間非同期通信を構築するためのより簡単な方法はありますか?または、Core Dataに対する私のアプローチは完全にオフキルターですか?
前もって感謝します!
iphone - iPhone アプリケーションと Objective-C サーバー側アプリケーションの間の双方向ネットワークをどのように実装すればよいですか?
Objective-C で記述され、Mac で実行されている「サーバー側」アプリケーションと、iPhone で実行されているクライアント アプリケーションとの間である種の双方向通信を実装するための最良の方法についてのアドバイスを探しています。
簡単に言うと、既存のライブラリをクライアント サーバー環境で使用できるように変更しています。ライブラリ (サーバー上で実行される) は、基本的に、定期的な結果を提供する検索エンジンであり、さらに後日、これらの結果の更新を提供できます。したがって、理想的な世界では、仮想ネットワーク ソリューションで次のことを実現できます。
- サーバーでクエリを開始します。
- 結果が到着したら、サーバーが結果をクライアントに「プッシュ」するようにします。
- サーバーが個々の結果の更新をクライアントに「プッシュ」するようにします。
このクライアントを別の Mac で実行するように作成している場合は、サーバーが実際にリモートで実行されているという事実を隠すために分散オブジェクトを使用することを考えるかもしれませんが、DO は iPhone では使用できません。
より一般的なクライアント/サーバー アプリケーションを作成している場合は、おそらく HTTP を使用して、検索にある種の RESTful インターフェイスを提供することを検討するでしょうが、このソリューションは非同期更新には適しておらず、さらに私が提案しているものはうまく適合しません。 REST の「ステートレス」の原則: プロトコルをモデル化する必要があるため、検索リソースを「作成」し、後で状態を照会できるようにし、その更新をポーリングする必要があります。
誰かが行った 1 つの提案は、BLIPのようなものを利用して、クライアントとサーバー間の双方向パイプを提供し、サーバー側のリソース用に独自の「プロキシ」タイプのオブジェクトを実装することでした。さらに、サーバーが更新をそれらにプッシュできるようにアドレス指定可能でした。BLIP は双方向通信に必要な低レベルのメッセージング フレームワークを提供しますが、それでもいくつか疑問が残ります。
- サーバー上のオブジェクトの有効期間をどのように管理しますか? 検索オブジェクトを「作成」するメッセージ タイプを使用できますが、そのオブジェクトはいつ破棄する必要がありますか?
- これが iPhone でどの程度うまく機能するか: サーバーに常時接続している場合、バッテリーの消耗が早すぎますか? この質問は HTTP の世界にも当てはまります。ほとんどの非同期更新は、永続的な接続を必要とする COMET タイプのハックを使用して行われます。
したがって、今のところ、最善の方法が何であるかはまだ完全にはわかりません。多くの検索と読み取りを行ってきましたが、解決策はありません。すでにこの問題を解決した人がたくさんいると確信しているので、SO で質問しています。
iPhone と Objective-C のサーバー側アプリの間でリアルタイムの双方向ネットワークを実現するために、どのように取り組んできましたか?
objective-c - Objective-C 分散オブジェクトを使用したメモリ管理: 一時インスタンスは永久に存続します!
Objective-C Distributed Objectsで遊んでいますが、システムでメモリ管理がどのように機能するかを理解するのに問題があります。以下の例は、私の問題を示しています。
プロトコル.h
サーバー.m
Client.m
問題は、ルート プロキシによって作成されたリモート オブジェクトが、クライアント内の対応するプロキシがスコープ外になったときに解放されないことです。ドキュメントによると:
オブジェクトのリモート プロキシの割り当てが解除されると、受信者にメッセージが返され、ローカル オブジェクトが接続を介して共有されなくなったことを通知します。
したがってDOTarget
、接続のリモート側で保持されている他の参照がないため、それぞれが範囲外になると (ループのたびに)、リモートの相手が割り当て解除されると予想されます。
実際には、これは起こりません。一時オブジェクトは、クライアント アプリケーションが終了したとき、またはより正確には、接続が無効になったときにのみ解放されます。ループのたびに使用している NSConnection オブジェクトを明示的に無効にして新しいオブジェクトを作成することで、リモート側の一時オブジェクトの割り当てを強制的に解除できますが、どういうわけかこれは間違っているように感じます。
これは DO の正しい動作ですか? すべての一時オブジェクトは、それらを作成した接続が続く限り存続する必要がありますか? したがって、接続は、サーバーに対する一連のリクエストごとに開いたり閉じたりする必要がある一時オブジェクトとして扱われますか?
任意の洞察をいただければ幸いです。
architecture - 動的 Web アプリケーションに分散ハッシュ テーブル (DHT) を使用できますか? 別の P2P 設計?
pub/sub タイプのアプリケーションを使用する双方向 Web アプリケーションに分散ハッシュ テーブルを使用できますか?
フォーラム タイプのアプリケーションの構築を調査していますが、DHT アーキテクチャと P2P を使用しています (ただし、パフォーマンスを向上させるために中央のルックアップ サーバーは問題ありません)。クライアント側の Gnutella/Kazaa タイプのアプリケーションを考えてみてください。ただし、メッセージは中央サーバーに到達するのではなく、インターネット上の他のクライアントに分散されるトピックに投稿されます。はい、これが少し奇妙に思えることは承知していますが、私には理由があります... :) 結果整合性 (5 分以内など) は問題ありません。
私はDHTのものを見てウェブをくまなく調べてきましたが、ほとんどが理論的なようで、DHTが本当に実用的かどうかはわかりません. また、トピックを更新するか、少なくとも「ダーティ ビット」をマークする必要があります。
サイトの達人から何か考えはありますか? また、試すべき最も成熟した DHT フレームワークに関する推奨事項はありますか?
乾杯、アレックス