2011-12-23 84 views
2

我有一個應用程序,我需要查詢數據庫來獲取/放置信息。我不能同步執行它,因爲它會阻止我的整個過程,直到函數返回。如何避免異步等待

基本上我有一個運行在特定點的一個或多個查詢的一些功能。

fun 
    stuff1 
    stuff2 
    stuff3 

    query1 
    stuff4 

    query2 
    stuff5 
  • 我可以在單獨的線程啓動的功能,但隨後我會鎖定一切努力防止種族(我認爲鎖定可能是慢?)

  • 我可以開始了異步查詢並監視它們,但然後我將不得不拆分我的功能並使用回調,當qouery結束時將運行

我對一般解決方案感興趣,但是我的平臺是POSIX,數據庫(不幸)是mysql。

你會怎麼做?你將如何處理?

謝謝你的時間。

+0

是哪個平臺? – Aliostad

+0

@Aliostad我對一個通用解決方案感興趣。 – nc3b

+0

這將是平臺具體... –

回答

1

有跡象表明,已經知道和使用的相當一段時間的模式,我相信他們並沒有改變。

  1. 獨立運行的功能:使用不同的線程
  2. 運行依賴於所有這些獨立的功能和作用,然後:使用不同的線程,並在年底加入他們 - 它們同步。我不知道POSIX,但在.NET中我們有EventWaitHandle可以等待爲多個線程,並通知所有完成後。
  3. 每個依賴另一個的運行函數:在單個後臺線程上運行並鏈接回調。 .NET再次提供了鏈接,這使得讀取和寫入代碼變得更加簡單。 jquery現在提供promise這是同樣的事情。
1

取決於情況有多複雜。在一個簡單的場景中,將多個函數作爲查詢的回調函數進行工作 - 這是一個有效的解決方案。在更復雜的場景中,你需要一些像Spring這樣的依賴注入框架。

1

您可以創建一個新的線程,將處理數據庫查詢隊列。此線程將包含一個列表,其中包含要在數據庫上執行的下一個操作,並且可以通過以下函數訪問:MyDatabaseQueue.PerformActionWhenFree(Action a,Callback callmebackwhendone)。此線程將負責一次創建一個查詢線程。這樣,您始終可以在隊列中接收更多的查詢,並且一次只有一個數據庫查詢線程。

1

那麼,如果查詢是緊耦合的,你可以簡單地啓動一個並行線程與pthread_create,依次上線運行。因此,你的主線程不會被阻塞,你仍然不需要使用任何鎖。