Salut,
Pour me remettre à OCaml après un passage par Python, j'ai décidé de reprendre un projet que j'avais abandonné.
Seulement quand j'avais commencé ce projet je l'avais fait avec les pieds, notamment pour ce qui est de la gestion de la concurrence. Donc je me suis dit, autant apprendre à faire ça correctement.
En gros, une des actions que j'ai le plus souvent besoin de faire c'est de lancer des algos depuis l'interface graphique. L'interface graphique ne doit pas freezer et il doit être possible de lancer plusieurs algos en même temps, ainsi que d'arrêter des algos en cours d'exécution depuis l'interface graphique.
Je précise que je n'ai aucune connaissance de tout ce qui est programmation
système, encore moins en OCaml (j'avais fini par apprendre à faire quelques trucs en Python mais c'était surtout de la manipulation de boîtes noires). L'ensemble de mes connaissances vient de ce document, que j'ai découvert il y a quelques jours.
Après l'avoir lu, il m'a semblé une façon de faire pourrait être de :
- Faire tourner l'interface graphique dans le processus principal.
- Lancer dans des algos dans d'autres processus plutôt que dans des threads.
Certes, il y aura le problème du coup de la copie de l'environnement et du transfert des données, mais si j'ai bien compris ça devrait me permettre d'exploiter plusieurs coeurs (enfin, le jour où j'aurai un PC multicore...). Et la gestion de la concurrence sera simplifiée.
- Ensuite, le processus parent doit attendre le résultat du processus fils, pour pouvoir ensuite modifier l'environnement en conséquence. Le problème, c'est que je ne veux pas freezer mon interface graphique. Du coup, je me suis dit que je pourrais le faire retourner dans le thread principal (ainsi, il retombe sur la event loop de Tk), et le faire attendre dans un thread, dont le seul but sera d'attendre le résultat, de le lire depuis le pipe, puis d'actualiser l'environnement en fonction de ce résultat.
J'ai résumé ça sur un diagramme :
Ma question est simple : Est-ce la (ou a défaut une) bonne façon de procéder ?
Plus précisément :
- Est-ce que l'utilisation d'un processus (plutôt qu'un thread) pour faire tourner l'algorithme est une bonne idée ?
- Est-ce que le transfert du résultat du child vers le parent via un pipe plus de la sérialization est une bonne idée ?
- Est-ce que le fait de faire attendre le résultat dans un thread secondaire de manière à faire retomber le thread principal sur Tk.mainLoop est une bonne idée ?
- Même si c'étaient de bonnes idées, y en a-t-il des meilleures ?
Bon puis après il y aura la question de l'implémentation. Pour l'instant j'ai essayé de faire un truc mais ça ne marche pas. J'attends vos conseils sur les modifications à faire avant de reprendre mon code et de le poster...
Merci d'avance !
Partager