2011-12-23 20 views
2

情報を取得/取得するためにデータベースを照会する必要のあるアプリケーションがあります。関数が返るまで私のプロセス全体をブロックするので、私はそれを同期的に行うことはできません。非同期待ちを回避する方法

基本的には、ある時点で1つ以上のクエリを実行する関数がいくつかあります。

fun 
    stuff1 
    stuff2 
    stuff3 

    query1 
    stuff4 

    query2 
    stuff5 
  • 私はレースを防ぐためにすべてをロックする必要があります別のスレッドで機能を開始、その後可能性(私はロックが遅くなることができると思う?)

  • 私が開始することができます非同期でクエリを実行して監視しますが、その後は私の関数を分割し、qoueryが終了したときに実行されるコールバックを使用する必要があります

私は一般的な解決策に興味がありますが、私のプラットフォームはPOSIXであり、データベースは(残念ながら)mysqlです。

あなたは何をしますか?どうやってこれを扱いますか?

ありがとうございます。

+0

which platform is it ??? – Aliostad

+0

@Aliostad私は一般的な解決策に興味があります。 – nc3b

+0

それはプラットフォーム固有のものになるでしょう... –

答えて

1

かなり知られていて、いつか使用されているパターンがありますが、変更されていないと思います。それらを同期させる - 利用異なるスレッドと終了時に、それらを結ぶ:使用異なるスレッド

  • それらのすべてに依存独立した機能とその関数を実行する:独立した機能が実行

    1. 。私はPOSIXについてはわかりませんが、.NETではEventWaitHandleがあります。は複数スレッドのためにを待ち、すべて終了したら通知します。
    2. それぞれが別のものに依存する実行機能:1つのバックグラウンドスレッドで実行し、コールバックを連鎖させます。 .NETはTask<T>連鎖を提供しているため、コードの読み書きがはるかに簡単です。 jqueryは同じものであるpromiseを提供しています。
  • 1

    状況がどれほど複雑かによって異なります。シンプルなシナリオでは、クエリへのコールバックとして与えられた複数の関数間で作業を分割することが有効であり、有効な解決策です。より複雑なシナリオでは、Springのような依存性注入フレームワークが必要です。

    1

    データベースクエリキューを処理する新しいスレッドを作成できます。このスレッドは、データベース上で実行する次のアクションを含むリストを保持し、MyDatabaseQueue.PerformActionWhenFree(アクションa、コールバックcallmebackwhendone)のような関数によってアクセスされます。このスレッドは、一度に1つのクエリスレッドを作成します。こうすることで、常にキュー内でより多くのクエリを受け取ることができ、一度に1つのデータベースクエリスレッドしか持てません。

    1

    クエリが緊密に結合されている場合は、pthread_createで並列スレッドを開始し、そのスレッドで順次実行することができます。したがって、メインスレッドはブロックされず、ロックを使用する必要はありません。

    関連する問題