IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Partager des objets en mémoire


Sujet :

Python

  1. #21
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par sazearte Voir le message
    tu ne pourra pas, en python tu ne peut pas partager en mémoire des objets, pas de manière automatique.
    Tu peut bidouiller en utilisant pickle ou manager.

    Pour ma part, j'ai développer un programme qui permet de tous partager de manière "universelle", à l'exception de certaines lib comme les ihm sous tkinter ou qt par exemple (tous ce que pickle peut pas en faite), voici mon code avec un exemple
    Jolie bidouille avec pickle et des Array.

    multiprocessing sait quand même faire des choses.
    Par exemple avec les namespace où on peut placer des objets "partagés".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    from multiprocessing import Process, Manager
    import os
     
    class Foo:
        def __init__(self):
            self.f = 1
            self.f2 = 1
            self.mylist=[0,1,2,3,4,5,6]
     
        def foo(self):
            self.f += 1    
     
     
    def g1(ns):
        f = ns.f
        f.foo()
        print(f)
        ns.f = f
     
     
     
     
    def Otherprocess(ns):
        s = ns.f
        print("Process2 :")
        print(s.f)
        s.mylist=[0]
        """while True:
            s.f2+=1"""
        ns.f = s  
     
     
    if __name__ == '__main__':
        mgr = Manager()
        mgr.register('Foo', Foo)
        ns = mgr.Namespace()
        ns.f = Foo()
     
        print(ns.f)
        p = Process(target=g1, args=(ns,))
        p.start()
        p.join()
        p2 = Process(target=Otherprocess, args=(ns,))
        p2.start()
     
        p.join()
        p2.join()
        print (ns.f.mylist)
    pourvu qu'on n'oublie pas de forcer la mise à jour de l'objet dans le NS après qu'il ait été modifié.
    Le gros soucis étant la synchronisation (sérialiser les mises à jour sinon l'état de l'objet sera inconsistant), ce n'est un détail.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  2. #22
    Inactif  

    Homme Profil pro
    NR
    Inscrit en
    Juin 2013
    Messages
    3 715
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : NR
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2013
    Messages : 3 715
    Points : 1 184
    Points
    1 184
    Billets dans le blog
    9
    Par défaut
    Jolie bidouille avec pickle et des Array.
    Oui mais très franchement j'aimerais bien que le langage intègre cela nativement sans recourir à pickle (qui "plombe" les performances).

    En faite sous Linux on le faire nativement, si on utilise des global la variable est partagé entre tous les process. Mais sa marche pas sous windows.

    je connaissait pas cette histoire d'affinty avec le cpu je regarderais quand j'aurais plus temps.

    Sinon pour conclure, @luklu7 le multi-processing c'est bien pour des traitements cpu parallèle, si en revanche tu souhaite paralléliser des instructions cpu avec des entrées/sortie les threads fonctionne très bien, car dans ce cas le gil se désactive.
    Autre piste intéressante, si c'est possible au lieu de faire certains calcules sur cpu avec des matrice numpy, essaye de le faire sur le gpu avec PyOpenCL sa sera plus rapide, PyopenCl supporte très bien numpy y'aura pas besoin de changer grand chose au niveau du code (juste un import et le code réalisant les calcules).

    Edit: je viens de découvrir que mon système avec pickle pouvait partager des objets de type datetime, normalement j'aurais du avoir cette erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TypeError: can't pickle time objects
    mais il l'a accepté sans problème

    Demain je vais essayé de m'amuser un peu et de voir ce qu'il est possible de faire avec Tkinter histoire de voir un peu les limites de ma solution.

Discussions similaires

  1. Réponses: 6
    Dernier message: 05/03/2008, 13h00
  2. Taille d'un objet en mémoire
    Par dr23fr dans le forum Général Java
    Réponses: 1
    Dernier message: 23/05/2006, 11h39
  3. création d'objet en mémoire partagé
    Par BigNic dans le forum C++
    Réponses: 6
    Dernier message: 28/11/2005, 18h41
  4. Implémentation des objets en mémoire
    Par SteelBox dans le forum C++
    Réponses: 6
    Dernier message: 15/01/2005, 21h38
  5. Partage de blocs mémoire entre 2 processus
    Par rolkA dans le forum Windows
    Réponses: 6
    Dernier message: 18/11/2003, 19h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo