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 :

Ecriture / lecture dans un tableau


Sujet :

Python

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juillet 2008
    Messages : 27
    Points : 22
    Points
    22
    Par défaut Ecriture / lecture dans un tableau
    Bonjour,

    Je vous explique mon soucis:
    Je fait un programme qui communique via liaison RS232.

    Niveau threading :
    Un fonction dépile des trames que j'ai stocké au préalable dans un tableau 'rs_transmit'. 0.5s.
    Une autre fonction scrute la liaison et me stocke toute les trames reçu dans un tableau : rs_read. 0.5s.

    Dans mon programme principal je lance différence séquence. Lorsque je lance une action (ajoute une ligne a rs_transmit) je vais recevoir un acquittent si il est ok je continue, sinon je voit [...].

    Ma question, est ce que ca pose problème que je scrute un tableau(rs_read) (fonction principale) et que je le remplisse (rs_read), sans prévoir aucune structures de lock/unlock ? Car j'ai l'impression que je ne peut pas manipuler le tableau en même temps

  2. #2
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Points : 1 658
    Points
    1 658
    Par défaut
    Y a pas de tableaux en Python.

    Quelle est la structure de données que tu désignes du terme impropre de “tableau“ stp ?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juillet 2008
    Messages : 27
    Points : 22
    Points
    22
    Par défaut
    Citation Envoyé par eyquem Voir le message
    Y a pas de tableaux en Python.

    Quelle est la structure de données que tu désignes du terme impropre de “tableau“ stp ?
    Désolé, abus de language de ma part : list

  4. #4
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 064
    Points : 1 402
    Points
    1 402
    Par défaut
    acceder simultanement a la table ça peut-être mal ... surtout avec 3 threads.
    un verrou ça coute rien et c'est plus sûr.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juillet 2008
    Messages : 27
    Points : 22
    Points
    22
    Par défaut
    Citation Envoyé par josmiley Voir le message
    acceder simultanement a la table ça peut-être mal ... surtout avec 3 threads.
    un verrou ça coute rien et c'est plus sûr.
    Comment doit je faire pour mettre un verrou ?
    Un verrou peut être mis sur une variable ?

  6. #6
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 064
    Points : 1 402
    Points
    1 402
    Par défaut
    le verrou entoure la zone memoire qui doit etre accedée.

    verrou=thread.allocate_lock()

    def lafonctionquitraitelatable(action):
    verrou.acquire()
    ...si action == lire
    ...si action == ecrire
    ...si action == ajouter
    verrou.release()

    je ne sais pas si on peut poser un verrou autour d'une variable.
    cette exemple ne corespond peut-etre pas a ce que tu veux faire.

  7. #7
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 484
    Points : 9 286
    Points
    9 286
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    C'est assez facile d'utiliser un verrou avec le module threading.

    Pour initialiser un verrou:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    verrou = threading.Lock()
    Pour qu'un thread demande le verrou (en attendant qu'il soit libre):

    Et après le travail, pour le relacher (=pour permettre aux autres threads d'y accéder):

    En fait, il n'y a pas d'autres liaisons entre le verrou et l'accès aux ressources que celle que donne le code du programmeur.

    Tu peux t'inspirer de mon tuto ici: http://python.jpvweb.com/mesrecettespython/thread_lock.

    Tyrtamos

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 435
    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 435
    Points : 37 020
    Points
    37 020
    Par défaut
    Bonsoir,
    Citation Envoyé par josmiley Voir le message
    je ne sais pas si on peut poser un verrou autour d'une variable.
    cette exemple ne corespond peut-etre pas a ce que tu veux faire.
    Il faut penser à un verrou comme un moyen de sérialiser les opérations à l'intérieur de acquire/release.
    A priori, ils ne sont nécessaire que pour rendre "atomique" une séquence de type lecture/modification/écriture de variables globales.

    Plutôt que de mettre une gestion de verrous autour des opérations de mise à jour d'une liste, pourquoi ne pas utiliser l'objet Queue du module threading? Les opérations put et get sont déjà protégées par un verrou.
    Par contre, dans sa description l'auteur ne précise pas si ses listes sont utilisées pour faire un accès direct (le nième élément) ou seulement le premier et de dernier. Dans ce cas, queue ne va pas le faire.
    -W

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juillet 2008
    Messages : 27
    Points : 22
    Points
    22
    Par défaut
    J'ai essayé d'implémenter mes balise verrou.acquire() et verrou.realease() autour de tous mes commandes .append() et .pop() de mes deux listes. Mais J'ai l'impression que je tombe toujours dans une boucle ou mes thread ne s'execute plus.


    -> thread1 : transmit
    while(1):
    si taille(rs_transmit) != 0 : // regarder si il y a une trame a envoyer
    pour i suivant la taille de rs_transmit: // envoi de toutes les trames
    verrou.acquire()
    frame = rs_transmit.pop(0)
    verrou.release()
    com.write(frame) // envoi RS

    -> thread2 : reception
    while(1):
    a = com.read(200) // lecture du buffer RS
    si a != "" :
    verrou.acquire()
    rs_reception.append(a)
    verrou.release()

    -> IHM : lancement d'action via des sequences ou des scripts
    verrou.acquire()
    rs_transmit.append(cmd)
    verrou.realease()


    voila en gros ce que je fait.

  10. #10
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 064
    Points : 1 402
    Points
    1 402
    Par défaut
    non s'pas ça.

    c'est plutot du genre:

    ->def traitementt(action,arg)
    verrou.acquire()
    si action==transmit : frame = rs_transmit.pop(0)
    si action==reception : rs_reception.append(arg)
    si action==commande : rs_transmit.append(arg)
    verrou.realease()

    -> thread1 : transmit
    while(1):
    si taille(rs_transmit) != 0 : // regarder si il y a une trame a envoyer
    pour i suivant la taille de rs_transmit: // envoi de toutes les trames
    traitement(transmit,None)
    com.write(frame) // envoi RS

    -> thread2 : reception
    while(1):
    a = com.read(200) // lecture du buffer RS
    si a != "" :
    traitement(reception,a)

    -> IHM : lancement d'action via des sequences ou des scripts
    traitement(commande,cmd)

    tu crees une fonction qui traite la liste et c'est cette fontion que tu dois verouiller; les threads feront des appels et attendront que la fonction se libère.

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juillet 2008
    Messages : 27
    Points : 22
    Points
    22
    Par défaut
    Citation Envoyé par josmiley Voir le message
    non s'pas ça.
    tu crees une fonction qui traite la liste et c'est cette fontion que tu dois verouiller; les threads feront des appels et attendront que la fonction se libère.
    C'est pas mal du tout, ca a l'air d'être nettement mieux. je poursuit mes essais pour confirmer ses premiers tests.

  12. #12
    Membre éclairé
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Points : 773
    Points
    773
    Par défaut
    les gars, vous devriez essayer de mettre vos codes entre deux balises [code]-votre code ici-[/code]

    C'est plus clair, et conserve l'identation

    l'exemple donné précédemment donne ceci :
    largement mieux, non ?

Discussions similaires

  1. Ecriture / Lecture dans un fichier Caché
    Par liavart dans le forum Général Java
    Réponses: 0
    Dernier message: 04/11/2009, 19h17
  2. Ecriture à 90° dans un tableau
    Par lagag dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 19/01/2007, 17h47
  3. Réponses: 22
    Dernier message: 22/12/2006, 19h01
  4. ecriture lecture dans un fichier
    Par maz dans le forum C
    Réponses: 3
    Dernier message: 19/10/2006, 12h21
  5. Problème de lecture dans un tableau associatif … ?
    Par sadao dans le forum Requêtes
    Réponses: 3
    Dernier message: 20/07/2006, 23h24

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