nunnun's weblog
非同期処理について調べた。
- 2009-10-03 (Sat)
- Technology
仕事のお話。
いわゆる非同期処理の話なのだが、あまり僕自身もこの領域は詳しくないので、調べてつつわかったことをアウトプットしてみます。
RPCを利用して処理を実行する場合、何もしないと同期処理となる。
つまりコールをして、結果が返るのを待ち、結果が返ってきたら処理を再開する。
これだと結果が返るのを待っている間は、"待つ"という処理を行うだけなので、CPUを有効的に活用できず非常にもったいない。そこで処理が終わるまで他の処理をさせておき、処理が終わったら結果を取得し、残りの作業をするという"非"同期的処理を行う必要がある。
Ajaxなどでよく利用されるXMLHttpRequestなどは非同期処理を活用しているわかりやすい例だ。
非同期処理のハンドルの仕方には大きく2つの手法がある。
- Futureに代表される、時間がかかる処理に結果をもらえる引換券を渡し、それを任意のタイミングで結果をもらいに行き処理を行うという方法
- CallbackやDeferredに代表される、処理が終わったら実行時にあらかじめ定義した関数を実行する方法
それぞれ長所短所が有るのだが、僕が作ろうとしているものにおいて、それぞれ問題がある。
- Future
結局誰かがFutureを監視する必要がある。 - Callback
非同期処理を行った後さらに別の非同期処理を行い、さらにその後に・・というフローではコーディング・運用両面で大変そう。
ただこれは非同期処理を呼び出すクライアントサイドで、あまり大きな問題にならない。
問題となるのはサーバサイドだ。
たとえばRPCでクライアントからリクエストを受けた後、サーバは別のホストにhttpコネクションを張り、そこから値を取るという処理をしたい場合、それぞれの処理単位で同期的に処理してしまえば楽だろうが、そうすると結局そこでブロックされてしまい、クライアントでブロックされないだけでシステム全体で見たらブロックが発生してしまう。
という問題をどのように解決したらいいか考えているのだが、まだ考え中。
また考えて考えがまとまったらエントリーに上げたいと思います。
[Jspider] WorkerThread::getState() returns incompatible type with Thread.getState
- 2008-10-22 (Wed)
- Technology ( Java )
On Java 1.5 or later, Java throws compile error in WorkerThread::getState() (net.javacoding.jspider.core.threading).
Because it returns incompatible type int with Thread.getState().
Thread.getState() [returns State] is implemented on Java 1.5 or later,
So I resolved this problem with following steps.
- Change method name from WorkerThread.getState() to WorkerThread.getThreadState()
- Change every method call thread.getState() to thread.getThreadState() on WorkerThreadPool.
[Japanese]
Java 1.5 以降においてJspiderを利用しようとすると、
WorkerThread::getState()においてコンパイルエラーが発生します。
理由としては、
Java 1.5 以降では、Thread.getState()が実装されたため、
その継承クラスであるWorkerThread.getState()が返す型が
Thread.getState()と異なるため発生します。
メソッド名がかぶらなければ良いので、
WorkerThread.getState()のメソッド名を変更することで解決します。
変更すべき箇所は以下の2ファイル
- WorkerThread.getState()
getThreadState()にでも変えましょう。 - WorkerThreadPool 内のthread.getState()をすべて先ほど変更したメソッド名に変更する。
これで問題なく動くようになります。