我正在创建一个可以监视100-150个设备的监视应用程序...现在要设计一个监视器应用程序,我有两种方法:
> < li>
为每个要监控的设备创建一个线程,每个线程将ping(使用ICMP)设备以了解设备是否在线。这些线程将无限期地运行,以便在特定的时间间隔(比如60秒)后了解它们的状态。
创建一个线程池,并为每个设备提交一个任务到一个线程池。任务是简单地 ping 到设备。因此,在当前设计中,任务将超过线程池中的线程。例如,假设有 100 个设备要监视,将有 100 个任务要监视,线程池将有 40 个线程来完成这 100 个任务。当然,运行下一组任务的持续时间将是这样的,即完成线程池中的所有挂起任务。
哪种方法会更好?
在计算最大线程数时,应考虑 ping 超时。有多少个线程需要 ping 100 个设备,给定 ping 超时 5 秒,重复周期为 60 秒?
在60秒内,每个线程可以执行12次设备ping(60秒允许12次ping在5秒后超时)。这意味着您至少需要9个线程,每个线程每60秒执行12次pings。
numberOfThreads=numberOfDevices/(轮询周期/pingTimeout)=100/(60/5)=100/12=9个线程
为每个设备创建单独的线程不是可伸缩的解决方案。想象一下,如果您的解决方案必须与越来越多的设备一起工作,比如从100到1000台;你不能每次都单独产卵。
创建线程池是一个理想的解决方案。您可以根据需求和资源可用性来调整线程池的大小。如果您需要在固定的时间间隔后重复ping设备,那么您可以使用调度执行器服务,它会在内部定期安排任务。但是没错,使用线程池是明智的选择。
我会创建一个schduledExecutorService
(例如通过Executors.newScheduledThreadPool
),允许您安排重复ping。您知道每次ping可能需要多长时间吗?我希望您可以使用很少的线程——远远少于40个,如果您每分钟只需要ping 100台设备中的每台设备一次。
你可以用合理的少量线程来启动它——但是要注意Mark Peters在评论中提出的信息——所使用的实现不会扩展(正如我所期望的);它实际上是一个固定的线程池。尽管如此,你应该能应付少于40个...
问题内容: 由于这个错误,我已经阅读,测试并在墙上摔了头一天。 我在名为这样的类中有一些Java代码,如下所示 我一直在调整JVM设置(从1到15G的任何地方)和(从104k到512M的任何地方)。服务器具有24 GB的RAM,但还必须运行支持该程序的数据库。 创建2-20个线程之后(程序中其他地方也有几十个线程),我得到了错误 产量: 发生这种情况时,系统上总是有大量的可用内存,其他程序继续可以
线程的创建 接下来,我们的第一个目标就是创建一个线程并且让他运行起来。一个线程要开始运行,需要这些准备工作: 建立页表映射,需要包括以下映射空间: 线程所执行的一段指令 线程执行栈 操作系统的部分内存空间 设置起始执行的地址 初始化各种寄存器,比如 sp 可选:设置一些执行参数(例如 argc 和 argv等 ) 思考:为什么线程即便与操作系统无关,也需要在内存中映射操作系统的内存空间呢?Clic
问题内容: 我是python和线程的新手。我已经编写了充当网络爬虫的python代码,并在网站中搜索特定的关键字。我的问题是,如何使用线程同时运行类的三个不同实例。当实例之一找到关键字时,所有三个实例都必须关闭并停止爬网。这是一些代码。 如何使用线程让Crawler同时执行三个不同的爬网? 问题答案: 似乎没有一种(简单的)方法可以终止Python中的线程。 这是一个并行运行多个HTTP请求的简单
我必须得到如下输出: 这是我的密码。没有错误。它以PlusThread开始并打印第一行。然后它将释放锁。之后,MultiplyThread开始运行。它将打印所有行,而不是通知PlusThread。 这是我的输出:
如果我有一个固定大小的线程池,它什么时候真正调用启动线程?(它会在创建时启动它们吗?还是等到我开始提交任务时再启动?)