如何避免异步等待

时间:2011-12-23 12:54:02

标签: multithreading asynchronous nonblocking

我有一个应用程序,我需要查询数据库以获取/放置信息。我无法同步执行,因为它会阻止我的整个过程,直到函数返回。

基本上我有一些函数可以在某些点运行一个或多个查询。

fun
    stuff1
    stuff2
    stuff3

    query1
    stuff4

    query2
    stuff5
  • 我可以在单独的线程中启动这些功能,但是我必须锁定所有内容以阻止比赛(我认为锁定可能很慢?)

  • 我可以异步启动查询并监视它们但是我必须拆分我的函数并使用在qouery结束时运行的回调

我对一般解决方案感兴趣,但我的平台是POSIX,数据库(不幸的是)是mysql。

你会做什么?你会怎么处理这个?

感谢您的时间。

4 个答案:

答案 0 :(得分:1)

取决于情况有多复杂。在一个简单的场景中,将多个函数分解为查询的回调将会起作用 - 并且是一个有效的解决方案。在更复杂的场景中,您需要一些依赖注入框架,如spring。

答案 1 :(得分:1)

有些模式已经知道并且已经使用了很长时间,我相信它们没有改变。

  1. 运行独立功能:使用不同的线程
  2. 运行独立函数和依赖于所有函数的then函数:使用不同的线程并在最后连接它们 - 同步它们。我不知道POSIX,但在.NET中我们EventWaitHandle可以等待多个线程,并在完成所有操作后通知。
  3. 运行每个依赖于另一个的函数:在单个后台线程上运行并链接回调。 .NET再次提供Task<T>链接,这使得读取和编写代码变得更加简单。 jquery现在提供promise,这是同样的事情。

答案 2 :(得分:1)

您可以创建一个处理数据库查询队列的新线程。该线程将包含一个列表,其中包含要对数据库执行的下一个操作,并且可以通过以下函数访问:MyDatabaseQueue.PerformActionWhenFree(Action a,Callback callmebackwhendone)。该线程将负责一次创建一个查询线程。这样,您始终可以在队列中接收更多查询,并且一次只能有一个数据库查询线程。

答案 3 :(得分:1)

如果查询紧密耦合,您只需使用pthread_create启动并行线程,然后在该线程上顺序运行它们。因此,您的主线程不会被阻止,您仍然不需要使用任何锁。