У меня есть процесс, который каждую секунду отправляет http-запрос на некоторый API. Затем этот процесс выполняет некоторую работу со строкой JSON, которая возвращается из запроса. В то же время я хочу передать эту строку JSON другому процессу, чтобы сделать что-то еще.
Ключевым моментом является то, что я хочу продолжать добавлять каждую новую строку JSON в конец массива, чтобы все строки JSON сохранялись в памяти на время выполнения программы.
Я изучаю использование каналов или mmap для обмена строками JSON, поскольку это, кажется, самые быстрые способы, о которых я знаю. Однако кажется, что конвейеры будут выполнять больше работы, чем необходимо, потому что мне придется отправлять строки, которые кажутся ненужными, поскольку они уже находятся в памяти.
Я думал, что mmap сможет избежать этой проблемы, если я смогу просто сопоставить массив обоим процессам. Я не хочу, чтобы строки записывались в реальный файл на диске, поэтому мне пришлось бы использовать анонимное сопоставление, но кажется, что анонимные сопоставления создают область, которая обнуляется, и тогда мне придется копировать свой массив в отображаемую память. области для обмена данными. Это тоже кажется ненужной работой, потому что я дублирую память.
Есть ли способ, которым я могу просто предоставить второму процессу доступ к массиву строк без дублирования строк или копирования? Я не могу использовать потоки, хотя потоки могут легко совместно использовать память, потому что процесс, выполняющий запросы REST, будет программой C++, а второй процесс будет программой Python.
mmap
для сопоставления сегмента разделяемой памяти с вашим процессом, но для создания или загрузки фактического сегмента разделяемой памяти необходимы другие обходные пути. Существует множество руководств о том, как это сделать. - person Some programmer dude   schedule 28.05.2020MAP_ANONYMOUS
? Это означает, что это анонимный сегмент разделяемой памяти, который можно использовать только в том случае, если выfork
обрабатываете себя внутри своей программы, и, что более важно, вам нужно отслеживать указатель, возвращаемыйmmap
(который должен быть вызван доfork
), так как это указатель, который должен использоваться всеми разветвленными дочерними процессами. Если у вас есть два независимых процесса или вы загружаете независимую программу через вызовexec
, вам нужен именованный сегмент памяти. - person Some programmer dude   schedule 28.05.2020