Мультипроцессорная совместная работа несериализуемых объектов между процессами
Есть три вопроса как возможные дубликаты (но слишком конкретные):
Как правильно настроить многопроцессорные прокси-объекты для уже существующих объектовПоделиться объектом с процессом (многопроцессорность)Могу ли я использовать ProcessPoolExecutor из будущего?Ответив на этот вопрос, можно ответить на все три других вопроса. Надеюсь, я проясню:
Однажды я создал объект в каком-то процессе, созданном многопроцессорностью:
Как мне пройтиссылка к этому объекту к другому процессу?(не так важно) Как сделать так, чтобы этот процесс не умер, пока я держу ссылку?Пример 1 (решено)
from concurrent.futures import *
def f(v):
return lambda: v * v
if __name__ == '__main__':
with ThreadPoolExecutor(1) as e: # works with ThreadPoolExecutor
l = list(e.map(f, [1,2,3,4]))
print([g() for g in l]) # [1, 4, 9, 16]
Пример 2
предполагатьf
возвращает объект с изменяемым состоянием. Этот идентичный объект должен быть доступен из других процессов.
Пример 3
У меня есть объект, который имеет открытый файл и блокировку - как я могу предоставить доступ другим процессам?
напоминание
Я не хочу, чтобы эта конкретная ошибка не появлялась. Или решение этого конкретного варианта использования. Решение должно быть достаточно общим, чтобы просто делить неподвижные объекты между процессами. Объекты потенциально могут быть созданы в любом процессе. Решение, которое делает все объекты подвижными и сохраняет идентичность, тоже может быть хорошим.
Любые подсказки приветствуются, любое частичное решение или фрагменты кода, которые указывают на то, как реализовать решение, чего-то стоят. Таким образом, мы можем создать решение вместе.
Вотпопытка чтобы решить эту проблему, но без многопроцессорности:https://github.com/niccokunzmann/pynet/blob/master/documentation/done/tools.rst
Вопросы
Что вы хотите, чтобы другие процессы делали со ссылками?
Ссылки могут быть переданы любому другому процессу, созданному с помощью многопроцессорной обработки (дубликат 3). Можно получить доступ к атрибутам, позвонить по ссылке. Доступные атрибуты могут быть или не быть доверенными лицами.
В чем проблема с использованием прокси?
Может быть, нет проблемы, кроме проблемы. У меня сложилось впечатление, что у прокси есть менеджер, а у менеджера есть собственный процесс, поэтому не сериализуемый объект должен быть сериализован и передан (частично решен с помощью StacklessPython / fork). Также существуют прокси для специальных объектов - сложно, но не невозможно построить прокси для всех объектов (разрешимых).
Решение? - Прокси + Менеджер?
Эрик Урбан показал, что сериализация не является проблемой. Реальная проблема в Примерах 2 и 3: синхронизация состояния. Моя идея решения заключается в создании специального прокси-класса для менеджера. Это прокси класс
принимает конструктор для несериализуемых объектовберет сериализуемый объект и передает его процессу менеджера.(проблема) в соответствии с 1. Несериализуемый объект должен быть создан в процессе менеджера.