Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

Faire du partage d'objet entre plusieurs process et faire de la synchronisation interprocess

0 votes

1 : Aucune librairie externe utilité que du pur stdlib 2.7.

Actuellement je cherche un moyen de rendre parrallèle certaines boucles for dans mon code et je me heurte à quelques problèmes (c-à-d je ne sais pas l'implémenter.) car j'ai des objets qui sont partagés pour tout les process.

Voici un de mes essais qui ne marche pas (du au fait que le manager ne permet que l'accès aux méthodes et nos pas aux attributs,choses que je souhaiterai rendre possible.)

Disons que mon objectif est de faire de l'execution concurrente sur plusieurs objets qui sont partagés,et malheuresment Process.pool ne me permet pas de faire ceci de manière effiace,(problèmes de synchronisation et aucune mise à jour de l'objet initial).

class SimpleClass(object):    

    def __init__(self):
        self.var = 0
        self.mydict = dict()

    def set(self,value):
        self.var = value

    def get(self):
        return self.var


def change_obj_value(obj):
    obj.set(100)

def change_val1(s_obj):
    s_obj.set(200)
    s_obj.mydict.update(dict(((5, 2),)))
    print str(s_obj.mydict) + " in val1 func"

def change_val2(s_obj):
    s_obj.set(400)
    s_obj.mydict.update(dict(((4, 2),)))
    print str(s_obj.mydict) + " in val2 func"



tst = SimpleClass()
tst.set(200)

SyncManager.register('SimpleClass',SimpleClass)

manager = SyncManager()
manager.start()
s_tst = manager.SimpleClass()



p = mp.Process(target=change_val1,args=[s_tst])
p2 = mp.Process(target=change_val2,args=[s_tst])

p.start()
p2.start()

p.join()
p2.join()

print "\nTST"
print tst
print tst.get()
print tst.mydict

print "\nS_TST"
print s_tst
print s_tst.get()
print s_tst.mydict
demandé 18-Aou par hellgheast (106 points)
edité 18-Aou par foxmask

1 Réponse

0 votes

... fait des getters / setters pour tes attributs ? Ça permettra d'avoir des méthodes de d'accès à tes données. Après, tu risques le dead-lock ou des états non prévisibles (un setter est appelé par un process 1 quand le process 2 appelle le getter)

Sinon, tu pourrais utiliser un socket pour faire la comm inter-process, mais il te faut alors écrire un langage de communication.

Ça serait sans doutes plus simple d'utiliser python 3... avec async / await

répondu 4-Sep par frague (444 points)
...