Существует большое количество полевых устройств (100 000, каждое из которых имеет индивидуальный IP-адрес), с которых я должен собирать данные.Я хочу сделать это в планировщике на основе Python в сочетании с легкодоступным исполняемым файлом, написанным на C / C ++, который управляет связью и считыванием устройств.Идея состоит в том, чтобы связываться с ~ 100 устройствами параллельно.Таким образом, первые 100 устройств могут быть считаны с помощью вызова подпроцесса исполняемого файла.Я не хочу ждать завершения всех 100 задач, потому что некоторые могут занять больше времени, а другие быстрее.Вместо этого я хочу начать следующий процесс сразу после того, как одна задача будет выполнена, и так далее.Итак, с помощью простого «диспетчера» происходит непрерывный запуск задач с течением времени.
Вопрос: Какой Python API лучше всего использовать для этой цели?
Я считал, чтоиспользуйте concurrent.futures
API, запускайте ThreadPoolExecutor
и отправляйте задачу за задачей, каждый из которых запускает исполняемый файл в отдельном потоке.ProcessPoolExecutor
не будет преимуществом, потому что исполняемый файл все равно запускается как процесс ...
Но я думаю, что это не предназначено для использования таким образом, потому что каждое представленное задание будетпомнил, следовательно, «вид хранится» в исполнителе навсегда;когда работа завершена, она заканчивается в статусе «завершена» и все еще видна, поэтому я испортил бы моего исполнителя с законченными задачами.Так что, я думаю, API-интерфейс Executor более удобен, когда есть заданное фиксированное количество задач, которые нужно обработать, как в
https://docs.python.org/3/library/concurrent.futures.html#threadpoolexecutor-example
, а не для постоянно отправка задач.
Другая идея состоит в том, чтобы запустить 100 рабочих потоков параллельно, каждый из которых работает в бесконечном цикле и читает свою следующую задачу, которая должна быть выполнена из объекта Queue.В этом случае я могу самостоятельно отправить работнику, которому отправлено новое задание.Я знаю, что это будет работать, потому что я уже реализовал это.Но у меня есть ощущение, что это должно быть более элегантное решение в Python для выполнения задач.