2016-11-09 5 views
0

Je veux garder une classe python en vie permanente afin que je puisse interagir en permanence avec elle. La raison en est que cette classe est très intensive en mémoire ce qui signifie que (1) je ne peux pas l'insérer plusieurs fois dans la mémoire, et (2) charger la classe est excessivement lent.Interagir avec les objets python stockés sur le serveur

J'ai essayé de l'implémenter en utilisant Pyro et RPYC, mais il semble que ces paquets suppriment toujours l'objet et créent un nouvel objet chaque fois qu'une nouvelle requête est faite (ce qui est exactement ce que je ne veux pas faire.) Cependant, j'ai trouvé l'option suivante pour Pyro:

@ Pyro4.behavior (instance_mode = "single")

qui assure une seule instance est créée. Cependant, puisqu'il est possible que plusieurs demandes soient faites simultanément je ne suis pas 100% que c'est sûr à faire. Y a-t-il une meilleure façon d'accomplir ce que j'essaie de faire?

Merci d'avance pour toute aide, il est grandement apprécié! (Cela fait longtemps que je me bats avec ça).

L

+0

Le mode d'instance par défaut de Pyro n'est pas de créer une nouvelle instance * par requête * mais plutôt * par session * (= connexion proxy). –

+0

C'est en effet le cas désolé pour mon erreur! Pour moi, c'était plus ou moins le cas puisque je ne fais qu'une seule demande par session, mais c'est effectivement une distinction importante. –

Répondre

1

Si vous ne voulez pas faire votre fil de classe en toute sécurité, vous pouvez définir SERVERTYPE à "multiplex", ce qui la rendra si tous les appels de méthode à distance sont traités de manière séquentielle.

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

serveur multiplexé (ServerType "multiplex")

Ce serveur utilise un multiplexeur de connexion pour traiter toute méthode distante appelle séquentiellement. Aucun thread n'est utilisé sur ce serveur. Il utilise le meilleur sélecteur supporté disponible sur votre plateforme (kqueue, poll, select). Cela signifie qu'un seul appel de méthode est en cours d'exécution à la fois, donc si cela prend du temps, tous les autres appels attendent leur tour (même s'ils proviennent de différents proxys). Le mode instance utilisé pour enregistrer votre classe ne changera pas la façon dont l'accès simultané à l'instance est effectué: dans tous les cas, il n'y a qu'un seul appel actif à tout moment. Vos objets ne seront jamais appelés simultanément à partir de différents threads, car il n'y a pas de threads. Cela affecte quand et à quelle fréquence Pyro crée une instance de votre classe.

+0

Yup. Mais si le paramétrage du servertype est un moyen de s'assurer que vos objets serveur pyro ne sont pas appelés simultanément, il est également possible de le laisser sur le serveur thread mais de définir les sections critiques de votre classe de serveur pyro et de les verrouiller correctement .Lock''). Quelle est la meilleure option dépend de ce que fait exactement votre classe et combien de temps elle passera dans la section critique. –

+1

Merci pour cette solution! Je l'ai essayé et cela semble fonctionner parfaitement. Je pense que je vais utiliser l'option "multiplex" pour l'instant, jusqu'à ce que je puisse trouver le temps de vraiment enquêter sur les parties de la classe qui devraient être verrouillées, le programme est encore en cours de développement. maintenant avec 100% de certitude. –