Чтобы управлять сторонним устройством, я использую модуль win32com
python для взаимодействия с предоставленным пользовательским интерфейсом. В целом это работает так, как ожидалось, но редко (каждые 10 тыс. Вызовов или около того) COM API выдает ошибку -2147024888
(0x80070008
) с описанием not enough storage is available to process this command
. Это очень раздражает, потому что обычно ночью происходит выход из строя устройства, и процедуру запуска необходимо полностью повторять.
Теперь вопрос в том, что на самом деле не хватает памяти, потому что я совершенно определенно не сталкиваюсь с какими-либо ограничениями по ОЗУ. Углубившись в проблему, я обнаружил, что я также не могу закрыть и снова открыть COM-соединение, поскольку это приводит к ошибке -2147024882
(0x8007000e
), описанной как out of memory
. Однако this намекает, что на самом деле здесь нет проблем с памятью. Еще одно объяснение: здесь предлагается слишком много используемых дескрипторов.
Эта идея будет подкреплена наблюдением, что я больше не могу разветвлять потоки на данный момент. Позвонив start()
на threading.Thread
, я получаю
RuntimeError: can't start new thread
хотя согласно threading.active_count()
выполняется только 4 потока. В то же время ни одна из этих проблем не наблюдается в другом процессе, на котором запущен python. Следовательно, я подозреваю, что в моем процессе не хватает ресурсов, но я не знаю, какие именно. На данный момент я вижу два варианта дальнейших действий.
Вариант 1. Узнайте, из каких ресурсов заканчивается мой процесс. Однако я не особо разбираюсь в отладке. Что я мог сделать, чтобы лучше понять, что происходит за кулисами?
Вариант 2: живите с проблемой и работайте над ее решением. В этом случае ловушки ошибок оказывается недостаточно. Как только возникает ошибка, кажется, нет никакого способа заставить все снова работать, не убивая процесс python. Конечно, это невозможно изнутри Python.
В качестве решения я подумал об использовании модуля
multiprocessing
и наличия всех связанных с устройством вызовы выполняются в отдельном процессе. Если что-то пойдет не так, я завершаю процесс в своей основной программе и запускаю ее снова с возможностью продолжить с того места, где произошла ошибка.
Для обоих вариантов я был бы рад предложениям или рекомендациям. Может быть, есть еще что-то совсем другое, о чем я не думал. Любая помощь приветствуется.
Изменить: мотивированный комментарием Бена, я просмотрел некоторые свойства все еще выполняющегося процесса, в котором произошли ошибки. Вот список данных, которые я считаю потенциально полезными:
- 1,7 Гбайт при использовании только 21 Мбайт и пиковой памяти 500 Мбайт (на Win7 x86)
- 800k ошибок подкачки
- 772 ручки
- 20 потоков
os.system
илиsubprocess
. Это так странно, что при каждом выполнении примерно 280popen
илиos.system
команд мой скрипт python выдает эту ошибку. Я пробовалgc.collect()
иsubprocess._cleanup()
, но ни один из них не работал. - person tigertang   schedule 14.11.2019subprocess
, я не могу сказать. - person ranguwud   schedule 26.11.2019subprocess
. Это связано с тем, что сторонняя библиотека продолжала добавлять системные пути до тех пор, пока не будет достигнута максимальная длина пути. Блин, а как можно сообщить об ошибке не хватает места для хранения? Это так обманчиво! - person tigertang   schedule 26.11.2019