2011-12-23 67 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,依次上线运行。因此,你的主线程不会被阻塞,你仍然不需要使用任何锁。