【问题标题】:Efficient "Pinging" with Java使用 Java 进行高效的“Pinging”
【发布时间】:2013-02-09 15:26:38
【问题描述】:

我怎样才能最有效地浏览一个包含 12,000 个 IP 地址的数据库,然后用它们 ping 打开一个套接字? 目前我的工作是这样的:

  • 获取列表中的所有 IP
  • 为每个 IP 打开一个新线程,该线程打开一个与服务器的套接字并接收来自它的数据包。
  • 在新线程上,根据 IP 在线的天气以及打开套接字时返回的内容更新信息。

我当前的解决方案有效,只需很长时间才能通过数据库一次。我正在尝试找到一种非常快速地通过数据库的方法;但是,我不知道从哪里开始。任何帮助表示赞赏,谢谢!

编辑:我打开一个套接字并发送一个 TCP 数据包,然后存储信息。

【问题讨论】:

  • 12k 线程?可能不是一个好主意。我会使用固定的工作池。
  • 如果您使用 UDP 并将所有内容保持在同一个线程上?
  • 明确一点,ICMP ping 还是什么? ICMP 没有套接字的概念。
  • 也许这有点帮助,虽然它不是多线程的:stackoverflow.com/questions/3345857/…
  • ping 12,000 个地址的速度是有限制的,这不是基于数据库的限制。说话需要时间。

标签: java mysql multithreading concurrency


【解决方案1】:

尝试为此使用 netty (NIO) 之类的东西。您可以将您的请求分散到一个线程中的所有 IP(无论出于何种原因),然后在另一个线程中等待返回。您当前的方法使用线程来管理所有远程主机的异步答案,这似乎没问题并且可以工作,但生产线程只是为了等待并不是最优的。更好地打开大量连接,发送数据包,等待结果并让操作系统管理等待。

如果您想执行耗时不可预测的并发计算,请仅使用多个线程。如果您有这样明确定义的任务,例如打开大量套接字、发送数据和等待响应,请在 java 中使用 NIO 框架(顺便说一句。通常这里单个线程就足够了)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-01
    • 1970-01-01
    • 2011-10-14
    • 2015-05-29
    • 1970-01-01
    • 2021-11-01
    • 2019-11-27
    相关资源
    最近更新 更多