boost-asio:用于不同任务的不同线程池

boost asio: different thread pool for different tasks

本文关键字:线程 任务 boost-asio 用于      更新时间:2023-10-16

网上有很多关于创建简单线程池的例子,例如Sample1和Sample2

不过,我想要实现的是为不同的任务提供一个单独的线程池。例如,应用程序可能有一个线程池,用于处理传入的tcp连接(让我们称之为网络池),而另一个池用于与数据库对话(数据库池)。

这些传入的tcp请求可能需要来自数据库的信息。在这种情况下,它需要请求数据库池中的那个些线程执行查询,并异步返回结果。

有没有推荐的使用boost::asio的方法?它会为每个池提供一个io_service实例吗?这些线程应该如何相互通信(使用boost)?

我理解解释所有这些,代码不会那么简短和琐碎,但如果可能的话,我们将非常感谢某种伪代码。

谢谢!

线程/线程池之间的通信应该通过线程安全队列。

在您的示例中,您应该有一个用于处理网络连接的网络线程池、一个用于执行网络请求的进程池和一个数据库连接/线程池(每个数据库一个池;每个数据库连接一个线程,但您可能有多个到同一数据库的连接)。

您还需要一个线程安全的队列,一个用于网络池、一个用于进程池和每个数据库池。

假设您有一个网络请求,需要从数据库中获取信息。您将在网络线程上执行时收到请求,并将请求的处理程序附加到进程队列中。

进程处理程序(在进程线程中)会发现请求需要来自数据库的东西,因此它会将数据库请求和回调处理程序附加到适当的数据库队列中。

适当的数据库线程将从数据库队列中获取请求,执行查询,获取结果,并将结果添加到回调处理程序中。然后,带有数据库结果的回调处理程序对象将被推送到进程队列中。

回调处理程序(在进程线程中)将继续执行请求,并可能打包一条响应消息,然后将其推送到网络队列中。

然后,网络处理程序(在网络线程中)将接收响应消息并传递它(根据需要进行编码)。

这里可以找到线程安全队列的示例。

尽管有点复杂,但你可以看到一个应用程序服务器的实现,它可以处理你在这里谈论的内容,尽管它可能对你试图做的事情来说有些过头了。源代码有很好的文档记录,所以你应该能够跟踪它,看看它在做什么。

我的示例对asio使用boost(请参阅同一系统中的TCP连接实现),但对处理程序不使用boost io_service。