Как предоставить доступ только для чтения (без копирования) к объекту в другом процессе в Cython?

Как предоставить доступ только для чтения (без копирования) к объекту в одном процессе другому процессу?

Например, на диаграмме ниже, как предоставить Process 2 и Process 3 доступ к классу Tasks, который находится в Process 1?

Process 1 — это единственный процесс, который будет писать в класс Tasks, и не важно поддерживать какое-либо состояние о том, какие задачи были обработаны и т. д.

Process 2                     Process 1                      Process 3
+-------------------+         +-------------------+          +-------------------+
|                   |         |                   |          |                   |
| Perform job A for | <----------+ class Tasks +-----------> | Perform job B for |
| task in Tasks     |         |                   |          | task in Tasks     |
|                   |         |                   |          |                   |
|                   |         |                   |          |                   |
|                   |         |                   |          |                   |
|                   |         |                   |          |                   |
|                   |         |                   |          |                   |
|                   |         |                   |          |                   |
|                   |         |                   |          |                   |
|                   |         |                   |          |                   |
|                   |         |                   |          |                   |
+-------------------+         +-------------------+          +-------------------+

Я думаю, что эти задачи могут включать использование указателей? документация Cython кратко описывает параллелизм.

Как предоставить Process 2 и Process 3 доступ только для чтения, без копирования к классу Tasks, который находится в Process 1?


person Greg    schedule 17.04.2018    source источник
comment
Насколько мне известно, нет простого способа разделить память между процессами, кроме копии указанной памяти. Однако, поскольку в Cython у вас есть возможность выпустить GIL и, таким образом, использовать многопоточность в полном объеме, может иметь смысл иметь многопоточное приложение, в котором каждый поток по-прежнему использует одну и ту же память (находясь в одном и том же процессе).   -  person Adonis    schedule 17.04.2018
comment
Угадайте, что many-PUB-s : many-SUB-s может предоставить инструмент для удаленно внедренных (таким образом, только для чтения) копий, которые могут пересекать границы процесса без каких-либо нарушений памяти. :o) очевидно, прекрасное искусство Zen-of-Zero -- то есть -- нулевая копия не будет работать через частную память процесса -границы.   -  person user3666197    schedule 18.04.2018
comment
Общий, нет. Скопировал, да. Процессы не разделяют память. В целом вам лучше использовать модель производителя/потребителя, в которой данные помещаются в общий контейнер, например в очередь, а элементы данных извлекаются из очереди всеми процессами. Таким образом, каждый процесс/поток получает отдельную часть работы и не нуждается в совместном использовании чего-либо. Сама очередь является контейнером, а не разделяемой памятью, см. multiprocessing.Queue и Queue.Queue. В приведенном выше примере Process1 добавит в очередь все остальные рабочие процессы.   -  person danny    schedule 18.04.2018
comment
@danny В документации по очереди говорится, что метод get удалит и вернет элемент из очереди. Причина только для чтения заключается в том, что для каждого элемента в Tasks есть несколько функций (например, Process 1 и Process 2), которым требуется задача в качестве входных данных. Причина отказа от копирования заключается в том, что каждый объект задачи большой и есть много функций, которым требуется ввод, поэтому создание очереди для каждого процесса и копирование объекта задачи каждый раз не является идеальным.   -  person Greg    schedule 19.04.2018
comment
Существуют более подходящие языки, в которых многопоточность не ограничена GIL (Java, C, C++ и т. д.), и они могут подойти для вашей идеи совместного использования памяти при использовании доступного параллелизма.   -  person Adonis    schedule 19.04.2018
comment
@Greg Это не меняет того факта, что процессы не используют общую память. Необходимо пересмотреть подход к решению задачи. Если вы хотите разделить память, это означает, что потоки не обрабатываются.   -  person danny    schedule 19.04.2018