2016-11-09 2 views
0

Я хочу сохранить класс python надолго живым, чтобы я мог постоянно взаимодействовать с ним. Причина этого в том, что этот класс интенсивно загружен в память, что означает, что (1) я не могу вместить его в память несколько раз, и (2) загрузка класса является чрезмерно медленной.Взаимодействие с сохраненными объектами python на сервере

Я попытался реализовать это, используя как Pyro, так и RPYC, но кажется, что эти пакеты всегда удаляют объект и создают новый объект каждый раз, когда выполняется новый запрос (именно этого я и не хочу делать.) Тем не менее, я нашел следующий вариант для Пиро:

@ Pyro4.behavior (instance_mode = "одиночный")

который гарантирует, что только один экземпляр создается. Однако, поскольку возможно одновременное выполнение нескольких запросов, я не на 100% уверен, что это безопасно. Есть ли лучший способ добиться того, что я пытаюсь сделать?

Заранее благодарим за любую помощь, мы очень благодарны! (Я боролся с этим довольно долгое время).

L

+0

Режим экземпляра Pyro по умолчанию не должен создавать новый файл * для запроса *, а скорее * за сеанс * (= прокси-соединение). –

+0

Это действительно извините за мою ошибку! Для меня это было более или менее так, потому что я делаю только один запрос за сеанс, но это действительно важное различие. –

ответ

1

Если вы не хотите, чтобы ваш класс поточно, вы можете установить SERVERTYPE в "multiplex", это будет сделать так, все удаленные вызовы методов обрабатываются последовательно.

https://pythonhosted.org/Pyro4/servercode.html#server-types-and-concurrency-model:

мультиплексированный сервер (ServerType "мультиплекс")

Этот сервер использует мультиплексор соединения для обработки всех удаленных вызовов методов последовательно. На этом сервере не используются нити. Он использует лучший поддерживаемый селектор, доступный на вашей платформе (kqueue, poll, select). Это означает, что за один раз запускается только один вызов метода, поэтому, если требуется некоторое время для завершения, все остальные вызовы ждут своей очереди (даже если они из разных прокси). Режим экземпляра, используемый для регистрации вашего класса, не изменит способ одновременного доступа к экземпляру: во всех случаях активен только один вызов. Ваши объекты никогда не будут вызываться одновременно из разных потоков, потому что нет потоков. Он все еще влияет на то, когда и как часто Pyro создает экземпляр вашего класса.

+0

Yup. Но при установлении типа сервера это способ обеспечить одновременное вызов ваших объектов пиро-сервера. Также можно оставить его на поточном сервере, но определить критические разделы в вашем классе pyro-сервера и правильно заблокировать их ('' threading .Lock''). Какой лучший вариант зависит от того, что именно делает ваш класс и сколько времени он потратит на критический раздел. –

+1

Спасибо за это решение! Я пробовал, и он работает отлично. Я думаю, что сейчас я буду использовать опцию «мультиплекс», пока не найду время, чтобы действительно исследовать, какие части класса должны быть заблокированы, программа все еще находится в разработке, поэтому может быть немного скоро это теперь со 100% уверенностью. –

Смежные вопросы