Parallèlisme - débutant

Le
Psylle du Poitou
Bonjour,

je connais Python depuis déjà pas mal de temps mais je n'avais jamai=
s été confronté aux problèmes de parallèlisme.

En fait je voudrais avoir 2 scripts différents

un premier script qui récupère des données sur le net (JSON, CSV)
ce script pourra éventuellement lancer plusieurs threads pour récupér=
er en parallèle chaque donnée
(est-ce une bonne idée ??)
Si le script rencontre une erreur de récupération d'un des éléments=
il devra le "marquer"
il lit au début un fichier CSV contenant les informations permettant de s=
avoir ce qu'il doit récupérer,
"marquer" les éléments ayant posé problème serait par exemple mettr=
e une donnée booléenne pour chaque info à récupérer.


un deuxième script doit se charger d'effectuer des calculs sur les donn=
ées récupérées (celles qui n'ont pas été marquées comme ayant=
posé un problème)
(mais uniquement après que le premier script ai terminé son travail (r=
écupérer l'ensemble des données)

Comment gérer cela ?

Avez-vous quelques conseils de lecture (si possible gratuite) pour comprend=
re ces notions de verrous, sémaphore, mutex (il semble que ce dernier n'e=
xiste plus dans Python 3)

Merci d'avance
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Laurent Pointal
Le #25292812
Psylle du Poitou wrote:

Bonjour,

je connais Python depuis déjà pas mal de temps... mais je n'avais jamais
été confronté aux problèmes de parallèlisme.

En fait je voudrais avoir 2 scripts différents

un premier script qui récupère des données sur le net (JSON, CSV...)
ce script pourra éventuellement lancer plusieurs threads pour récupérer en
parallèle chaque donnée (est-ce une bonne idée ??)



S'il y en a trop, il vaudra peut-être mieux s'orienter vers des solutions
comme twisted (http://twistedmatrix.com/trac/).

Si le script rencontre une erreur de récupération d'un des éléments il
devra le "marquer" il lit au début un fichier CSV contenant les
informations permettant de savoir ce qu'il doit récupérer, "marquer" les
éléments ayant posé problème serait par exemple mettre une donnée
booléenne pour chaque info à récupérer.

un deuxième script doit se charger d'effectuer des calculs sur les données
récupérées (celles qui n'ont pas été marquées comme ayant posé un
problème) (mais uniquement après que le premier script ai terminé son
travail (récupérer l'ensemble des données)

Comment gérer cela ?



La class Queue gère la synchronisation pour toi
http://docs.python.org/3.3/library/queue.html

"y'a plus qu'à" créer des threads qui se chargent de lancer les requêtes et
de placer les résultats (données ou indication d'erreur) sous la forme de
ton choix (tuple, classe perso) dans la queue.

Et un thread qui prend ce qui arrive dans la queue et lance les traitements.

Tu peux même imaginer en entrée une queue dans laquelle tu passes les
requêtes, et que tes threads de récupération

Avez-vous quelques conseils de lecture (si possible gratuite) pour
comprendre ces notions de verrous, sémaphore, mutex



En anglais, python threading example sur google devrait donner des pistes.
Je trouve même des liens vers des pages en français
http://python.developpez.com/faq/?page=Thread

mutex (il semble que ce
dernier n'existe plus dans Python 3)...



Mutex ==> Lock (ou RLock s'il faut qu'il soit réentrant), existe toujours en
Python3 (heureusement, c'est une des briques de base).

mutex = threading.Lock()
with mutex:
# ici le code qui est en section protégée


(vive "with")


Merci d'avance


--
Laurent POINTAL -
Psylle du Poitou
Le #25292942
Merci pour vos conseils...

pour ce qui est de Twisted ça me semble un peu trop gros par rapport à mes besoins

Par contre il y a un point que je n'ai pas bien compris... la classe Queue permet-elle de gérer l'attente du script "consommateur" de données tant que le script "producteur" de données n'a pas fini..

J'ai l'impression que c'est juste pour des threads qui sont lancés au sei n d'un même script
Laurent Pointal
Le #25292982
Psylle du Poitou wrote:

Merci pour vos conseils...

pour ce qui est de Twisted ça me semble un peu trop gros par rapport à mes
besoins

Par contre il y a un point que je n'ai pas bien compris... la classe Queue
permet-elle de gérer l'attente du script "consommateur" de données tant
que le script "producteur" de données n'a pas fini..



C'est ça.

J'ai l'impression que c'est juste pour des threads qui sont lancés au sein
d'un même script



Oui. Pour faire des transferts comme cela, je ne vois a priori pas l'intérêt
de faire du multiprocessing. Ceci dit, rien ne l'empêche, juste qu'il faut
prévoir ensuite la transmission des données entre processus de récupération
et processus de traitement, c'est encore autre chose par rapport à un
fonctionnement dans un même processus.

--
Laurent POINTAL -
Psylle du Poitou
Le #25293002
En fait l'idée c'est que j'ai plusieurs scripts qui peuvent consommer (di fféremment mes données)
et un seul qui les "produit".

Le problème c'est que je ne veux pas qu'un consommateur consomme les donn ées quand elles n'ont pas toutes été mise à jour...
Psylle du Poitou
Le #25292992
je ne vois a priori pas l'intérêt de faire du multiprocessing.



J'oubliai de préciser un point qui justifie cette architecture...

Mon "producteur" de données sera lancée en prod et ne sera "jamais" arr êté...
par contre mes consommateurs sont des scripts qui ne sont pas encore tous a u point...
donc j'ai besoin de pouvoir les lancer à la demande, les stopper, etc...
tout ça pendant que le "producteur" continue à faire juste son job... r écupérer les données
Publicité
Poster une réponse
Anonyme