我目前正在开发一个简单的P2P网络作为练习。网络中的每个节点都将心跳发送到其他节点的子集,以便能够检测已离开网络的节点。除了心跳包之外,我在新节点加入/离开网络时,当他们想要查找资源(小文本文件)等时发送数据包。所有数据包都是UDP数据包。
每当我收到一个数据包时,我就会启动一个处理该特定数据包的新线程。然而,我担心在一个应用程序生命周期中我开始的线程数量相当多(特别是因为心跳)。 (还有我想避免的死锁等风险)。
我考虑过拥有一个队列或者我放置所有传入数据包的东西,并且让一个线程一次一个地处理来自该队列的所有数据包(类似于生产者 - 消费者模式)。我希望快速处理数据包,这样发送方就不会认为数据包丢失了。
处理大量不同的传入数据包而不必为每个数据包启动新线程的最佳方法是什么?我应该选择我所拥有的,生产者消费或不同的东西吗?
答案 0 :(得分:0)
您的应用程序处理一个数据包需要多长时间?
对于ping,可能会更快地处理它们,你可以将其他人放在共享数据结构中,例如特定的阻塞队列,所以当队列为空时,工作线程等待新的工作,当添加新作业时,线程被唤醒并将完成工作。
可能每个数据包启动一个线程会使您在启动和停止线程时花费的时间比实际执行该线程要多。
如果响应数据包的事情对于所有类型的数据包都不是那么耗时,那么可能是因为队列锁定和调度线程所花费的额外时间使得程序变慢而不是更快。
在任何情况下都使用线程池并在开始时启动worker。如果您愿意,可以根据过去几分钟的负载动态增加或减少工作线程数。
答案 1 :(得分:0)
我会使用event driven architecture
。为每个数据包创建一个新线程是不可扩展的,因此这将适用于一定数量的工作负载,但有一点它将不再起作用。您可以将其与例如聊天程序,如Facebook聊天,其中消息是数据包。
事件驱动的架构将是可扩展的,恕我直言,正是您所寻找的。只是做一些谷歌搜索,有许多编程语言的库,所以只需选择合适的一个(我喜欢在Erlang,Scala,C或Python中做到这一点)。
编辑:好的,没看到java标签。但语言并不重要。
看一下这个链接,例如: http://www.nightmare.com/medusa/async_sockets.html
我觉得很容易理解事件驱动编程。