8

我目前正在开发一个简单的 P2P 网络作为练习。网络中的每个节点都向其他节点的子集发送心跳,以便能够检测到已离开网络的节点。除了心跳包之外,当新节点加入/离开网络时,当他们想要定位资源(小文本文件)等时,我会发送数据包。所有数据包都是 UDP 数据包。

每当我收到一个数据包时,我都会启动一个新线程来处理该特定数据包。然而,我担心我在一个应用程序生命周期中启动的线程数量加起来相当多(特别是因为心跳)。(还有我想避免的死锁等风险)。

我想过有一个队列或其他东西,我将所有传入的数据包放入其中,并让一个线程一次处理来自该队列的所有数据包(类似于生产者-消费者模式)。我希望快速处理数据包,这样发件人就不会认为数据包丢失了。

处理大量不同传入数据包而不必为每个数据包启动新线程的最佳方法是什么?我应该使用我所拥有的,生产者消费的还是不同的东西?

4

2 回答 2

0

您的应用程序处理一个数据包需要多长时间?

对于 ping 的,在收到它们时处理它们可能会更快,您可以将其他的放在共享数据结构中,例如特定的阻塞队列,因此当队列为空时,工作线程等待新作业,当添加了一个新的工作,一个线程被唤醒并完成工作。

可能每个数据包启动一个线程会使您在启动和停止线程上花费比实际执行工作更多的时间。

如果对于所有类型的数据包来说,响应数据包的事情并不是那么耗时,那么可能是花费在队列锁和调度线程上的额外时间会使您的程序变慢而不是更快。

在任何情况下,使用线程池并从一开始就启动工作人员。如果您愿意,您可以根据过去几分钟的负载动态增加或减少工作线程的数量。

于 2012-11-29T22:15:49.797 回答
0

我会使用一个event driven architecture. 为每个数据包创建一个新线程是不可扩展的,因此这将适用于一定数量的工作负载,但有一点它不再适用。您可以将其与 Facebook 聊天等聊天程序进行比较,其中消息是数据包。事件驱动的架构将是可扩展的,恕我直言,这正是您所寻找的。只需进行一些谷歌搜索,那里有许多编程语言的库,所以只需为您选择合适的库(我喜欢在 Erlang、Scala、C 或 Python 中这样做)。

编辑:好的,没有看到java标签。但语言无关紧要。

看看这个链接,例如: http ://www.nightmare.com/medusa/async_sockets.html

我发现了解事件驱动编程的想法非常好。

于 2012-11-29T22:48:06.730 回答