1K подписчиков

Программирование на языке Python. Модуль mmap, анонимная область и многозадачность

Доброго времени суток, читатели, зрители моего канала programmer's notes. Не забывайте подписываться и писать свои комментарии к моим статьям и видео.

Обмен данными между процессами с использованием mmap. Анонимная область памяти

Материал сегодняшней статьи посвящён использованию mmap во взаимодействии между процессами. Придётся вспомнить многозадачность и os.fork(). В противном случае материал будет не понятен. Вот эти мои материалы вам в помощь: видео, статья.

Задача данной статьи следующая: использовать механизм анонимной области памяти для взаимодействия родительского и дочернего процессов. Класс mmap позволяет создавать объекты без указания реального файла. Для этого в качестве дескриптора указывается -1.

Ниже представлена программа, в которой родительскиё и дочерний процессы взаимодействуют через анонимную область памяти, периодически записывая туда обобщения для другого процесса.

Программа взаимодействия лвух процессов через анонимный объект mmap. Текст программы см. ниже по ссылке
Программа взаимодействия лвух процессов через анонимный объект mmap. Текст программы см. ниже по ссылке

Пояснение к программе

  • В первую очередь обратим внимание на создание объекта с отрицательным дескриптором файла. mmap(-1, n) и создаёт анонимную область памяти длиной n байтов.
  • В предыдущей статье я уже писал, что когда работаешь с памятью - нужно помнить о кодировке. Поэтому в программе считывается и записывается вся область памяти. При попытке записывать только часть области можно оказаться в ситуации, когда меняется часть кода символа. В результате вы можете получить потом ошибку при чтении и перекодировке. В нашем же случае как раз используются символы русского алфавита, которые кодируются двумя байтами.
  • Принцип взаимодействия процессов в программе очень прост. Они периодически проверяют общую область памяти, ожидая, когда появится сообщение от другого. И здесь особо комментировать нечего, нужно просто внимательно посмотреть на код и вспомнить про os.fork().
  • Ну и нужно освежить память относительно time.sleep(), если забыли.

Ну, пока всё!

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

Эта область вашей памяти не имеет названия
Эта область вашей памяти не имеет названия