Общая память sysv_ipc Python

Добрый день. Я использую разделяемую память (sysv_ipc) между двумя разными процессами, и я хочу видеть время последнего обновления разделяемой памяти в другом коде. Есть три программы, одна записывает в общую память, другая читает из общей памяти, а третья мне нужна для обработки внешних ошибок, поэтому мне хотелось бы знать, не обновлялась ли общая память в течение последних нескольких минут. С этой идеей я попытался получить доступ к атрибуту "last_attach_time" разделяемой памяти. Он отлично работает, когда я запустил его в терминале. То есть я создал объект для разделяемой памяти один раз в терминале, а затем попытался получить непрерывный доступ к атрибуту, и он работал совершенно нормально. Пока общая память не была записана с данными, "last_attach_time" обновлял время, а когда запись прекращалась, вывод становился постоянным, и это прекрасно. Но когда я включил во внешний код обработки ошибок, который имеет цикл while для непрерывного мониторинга, атрибут не дает правильных данных. т.е. время все еще увеличивается даже после того, как запись в общую память остановлена. Кто-нибудь сталкивался с подобными проблемами. Благодарю.

1 ответ

Решение

Я автор питона sysv_ipc модуль.

Не видя ваш код, я не могу точно сказать, что происходит. Но у меня есть догадка.

В коде вашего монитора сравните сегмент памяти last_pid значение к значению os.getpid(), Если это то же самое, то есть ваш ответ - last_attach_time правильно сообщает время, когда ваша программа монитора подключена к памяти, чтобы увидеть, если кто-либо подключен к нему. :-)

Более полное объяснение: использование сегмента памяти SysV IPC является двухэтапным процессом. Сначала вы создаете его, а затем прикрепляете его. Вы не можете многое сделать с сегментом памяти, который вы не прикрепили, поэтому я написал sysv_ipc Модуль для автоматического присоединения сегмента для вас в конструкторе Python. Другими словами, конструктор Python выполняет оба шага (создание и присоединение) за вас. Вот что это означает, когда документация для конструктора говорит: "Память автоматически подключается" (но это легко не заметить).

Так что, если ваш код монитора создает новый sysv_ipc.Semaphore() объект каждый раз, когда он работает, он установит last_attach_time когда это так.

Похоже, вас больше интересует время последней записи, которое не является значением, предоставляемым SysV IPC. Один из подходов - записать метку времени как часть данных, которые вы записываете в общую память.

Другие вопросы по тегам