我必须从中收集大量的现场设备(100,000个,每个都有单独的IP)。 我想在基于python的调度程序中结合使用现成的用C / C ++编写的可执行文件来执行此任务,该可执行文件可处理设备的通信和读出。这个想法是与多达约100个设备并行通信。因此,可以使用对可执行文件的子进程调用来读取前100个设备。我不想等待所有100个任务完成,因为有些任务可能需要更长的时间,而另一些任务可能会更快。相反,我想在完成一项任务后立即将下一个过程付诸实践,依此类推。因此,由一个简单的“调度员”执行,随着时间的流逝,任务会不断开始。
问题:为此目的,我可以使用哪种Python API最好?
我考虑使用concurrent.futures
API,启动ThreadPoolExecutor
并逐个任务提交任务,每一个都在单独的线程中启动可执行文件。 ProcessPoolExecutor
不会是一个优势,因为无论如何可执行文件都是作为进程启动的...
但是我认为,这并不是要以这种方式使用,因为每个提交的作业都会被记住,因此永久地在执行者中被记住。当工作完成时,它的状态最终为“已完成”,并且仍然可见,因此我会将执行器与已完成的任务弄混了。因此,我猜想,当要像
中那样处理给定的固定个任务时,Executor API更有用。https://docs.python.org/3/library/concurrent.futures.html#threadpoolexecutor-example
,而不是永久提交任务。
另一个想法是,并行启动100个工作线程,每个工作线程都处于无限循环中,并从Queue对象中读取下一个要执行的任务。在这种情况下,我可以自己将下一个新任务发送给哪个Worker。我知道这是可行的,因为我已经实施了。但是我有一种感觉,它必须是Python中执行任务分派的更优雅的解决方案。