 Bienvenue au, ok, let me show you, bienvenue au, excusez-moi, j'ai oublié du passage, c'est mon écran, ok, je vais le voir, excusez-moi, bon, ok, là, j'imagine que tout le monde devrait voir mon écran, ok, c'est bon, oui, désolé pour le, le commentaire, c'est un peu, oui, c'est plus bon à répondre, je sais pas si j'ai bien traduit le mot en français, mais bon, hi everybody, welcome to Montréal-Piton, 90 qui, crispy silence, aujourd'hui on va avoir une orée très très charquée, fait que je vais pas trop faire d'annonce, ben, première annonce que je veux vous faire, ben, c'est comme d'habitude, c'est toujours, on a le code de conduit qui est sur, ben, je vous invite à aller le lire, le lien est sur la page YouTube de l'événement, et si vous voyez quelque chose qui est contre notre code de conduit, ben, envoyez-nous un commentaire sur YouTube ou sur Slack, notre équipe est là pour chérer ce genre de situation, et à Montréal-Piton, on a le code de conduit, le lien est sur le YouTube channel, donc, si vous voyez quelque chose qui ne fit pas notre code de conduit, vous pouvez envoyer nous le message sur Slack ou sur le YouTube channel, notre équipe est là pour fixer ce genre de choses, et, oui, la deuxième chose, c'est toujours après l'événement, je sais qu'on va finir un peu tard aujourd'hui, mais on va quand même avoir notre happy hour, alors si, mais le lien, le happy hour aussi est sur notre canal YouTube, après notre événement, comme d'habitude, on va avoir un happy hour, donc, si vous voulez rejoindre nous, le lien est sur notre YouTube channel, et c'est tout, comme je vous ai dit, on l'aurait très cher, j'ai oublié une chose, on voit la soirée de programmation qui est le 3 mai, le thème, ça va être sur machine learning, donc, on va vous envoyer toutes les informations plus tard. We are going to have the workshop, programming workshop, at the 30 mai, so, at 7 p.m., so, if you, we will send you all the information after. Ok, on voit une autre chose, vu qu'on parle de, après-où et tout ça, bien, je me remercie notre partenaire qui est FGNR, c'est eux qui nous offrent, qui hostent le taxi, c'est le logicien qu'on va utiliser pour faire notre happy hour. I would like to thank FGNR, who is our partner of hosting of a taxi platform. C'est tout, on va, bien, je vais arrêter ça, la chair screen, puis je vais amener tout de suite notre 1er invité, qui est Charmichaine, et j'achète aussi, oui, c'est ça, hey salut Charmichaine, oui, c'est bon, mais je ne dis pas, Charmichaine va faire quoi, il va vous dire seulement, bon, je vous laisse avec Charmichaine, ça va prendre le contrôle Charmichaine. Parfait, merci, dans le fond, c'est super simple, c'est juste un petit résumé d'une activité qu'on fait régulièrement à Montréal-Pitton, on fait des sprits pour contribuer à la traduction de la documentation version française de Pitton, donc à chaque fois qu'il y a une nouvelle version de Pitton, il faut l'updater parce que comment ça fonctionne, c'est que chaque paragraphe est modifié dans la version anglaise, on veut s'assurer qu'il soit parfait dans la version française, donc il doit y avoir quelqu'un qui le déduit, chaque fois qu'il y a des nouveaux features qui sont rajoutées à Pitton, on veut aussi avoir une documentation agile, donc une équipe qui travaille là-dessus, on peut voir l'équipe principale du côté français, c'est une super communauté, je trouve que c'est un parfait projet pour découvrir l'open source, moi si la première fois je contribue à un projet open source, ils sont très ouvert au débutant à accueillir des nouveaux, une nouvelle personne qui contribue, moi si la deuxième fois je participe, Yannick Piedut, je crois qu'il participe régulièrement, donc je n'ai pas l'air, c'est le constructeur principal au niveau de la France, puis on l'a rencontré au début, c'est super accueillant, c'est vraiment une belle communauté, c'est Jean-Ambou, ça me rassure aussi de Christophe Nanteuil qui commente régulièrement les poules request puis qui aident les gens, cette année de notre côté de Montréal-Pitton, il y avait quatre participants donc Yannick, Edith, moi Jean-Michel et Eliès de Tunisie, tout ça, chaque personne a des raisons différentes de contribuer, je crois qu'Eliès comme moi c'était vraiment pour découvrir l'open source, se pratiquer, Edith, si je me suis bien, elle voulait vraiment mieux comprendre un module qu'elle utilise beaucoup, donc JTTP Server, donc c'est ça qu'elle a traduit et Yannick adore les nouveautés, donc il a pris de l'avance sur la version 3.11 de Pitton et il a commencé à traduire le Wattinyu 3.11, donc il y a eu d'autres travail accomplis, comme on peut voir, je pense Edith elle a réglé un bug dans un script qu'on utilise pour la documentation et on peut voir un peu comment ça fonctionne, si on regarde par exemple dans le fond les poules request qu'on a fait, on peut voir Yannick ici avec son Wattinyu du 3.11, c'est super bien fait, chacun peut faire les contributions, moi je suis un peu mailleurs en traduction qu'en programmation donc moi j'ai proposé des améliorations mais il a proposé l'amélioration de l'emplacement des erreurs, moi je propose des améliorations parfois comme on formule les traductions et puis des fois c'est purement des trucs syntaxiques, par exemple moi ma poule request c'était vraiment quand on regarde son haut dans la documentation de Pitton, en 3.10 on a rajouté l'instruction match donc automatiquement il y a des trucs qui ne sont pas traduits, c'est nouveau, il y a des nouvelles traductions à faire et tout ce qui est modifié à chaque fois, c'était peut-être pas dans 3.10, je ne suis pas certain, je sais qu'il y avait des trucs nouveaux dans la version 3.10 qui fallait changer en français, donc j'ai juste révisé certains paragrapes massurés que ça ajoute, alors c'était vraiment un beau petit print très rapide, on a fait des contributions assez simples mais c'est toujours efficace et voilà, je pense qu'il y a Nick qui va vous en dire plus peut-être quand ça va être son taux, mais moi j'ai trouvé c'est une super belle expérience, je recommande à tout le monde qui veut faire des open source, on est super accueillis, les vétérans de GitHub comme Yannick et Adyth nous aident avec nos contributions, la même chose au niveau des poules request, on n'est pas sûr comment faire, les gens nous expliquent, les gens nous aident, Julien il explique très bien que c'est le moment parfait pour faire des erreurs parce que c'était une équipe solide qui a l'habitude d'encadrer des débutants, puis pour les gens l'expérience qui veut découvrir, découvrir un module comme Edith vous l'avez découvert et puis voilà, tu y vas en profondant, tu dis la doc, tu vas bien comprendre la doc pour la traduire, donc pour ceux qui ont plus d'expérience qui veulent approfondir quelque chose c'est génial, puis pour découvrir une nouveauté comme Yannick. Donc voilà, je vais me contenter de ça, je crois qu'on a une soirée changée. Merci beaucoup Jean-Michel pour ton témoignage, ça fait toujours chaud au coeur de savoir que notre communauté est là pour aider les gens, c'est bon. Merci beaucoup, à la prochaine Jean-Michel. Alors, ok, je vais vous donner notre prochain présenter à l'extérieur, il vient de l'Italie et je sais que c'est très, très léger, donc on apprécie beaucoup son temps. Alors, bonjour Mohamed Amé, notre prochaine évité c'est Mohamed Amé qui habite en Italie, c'est Mohamed Amir Sultan Zadeh et c'est ma présentation sur l'intelligence artificielle et l'imagerie d'image. Ces jours-là, on entend de l'imagerie d'image, de la vision computer et de l'intelligence artificielle tous les jours et toujours, mais beaucoup de gens croient que ces trois sont les mêmes, mais ce n'est pas le cas, ce sont différents types de tasks et aussi ces ont différentes responsabilités, donc je vais expliquer des différences entre eux et pour l'abord, je vais parler de l'imagerie d'image. L'imagerie d'image est un méthode pour performer, c'est un méthode pour performer des opérations sur l'image, c'est l'imagerie d'image. Par exemple, appliquer des filtres, comme un filtre bleu, un filtre canique, un filtre gray, ou mettre des textes sur l'image ou des images ou aussi vous pouvez appliquer différents masques sur l'image et tout. S'il vous plaît, considérez que vous avez pris un filtre bleu sur vos pet et vous voulez appliquer le filtre bleu sur vos médias sociaux, mais avant d'appliquer, vous voulez que l'image soit plus utile, donc vous voulez dire à votre ami que l'image a été appliquée au sondage, au matin, à 7 a.m. Et aussi, vous voulez mettre le nom de votre pet sur l'image, donc vous pouvez utiliser une simple application sur votre téléphone ou sur votre laptop que vous pouvez éditer votre image et l'application va utiliser l'image processer, l'image processer pour faire tout ce que vous voulez. Mais pour l'instant, nous devons savoir sur l'image, qu'est-ce que l'image est ? Tout d'abord, nous devons savoir que chaque image a trois canons, R, G, B, ou bleu-grin-grin. Et quand vous voyez une image, vous verrez une combination de trois canons ensemble, comme vous pouvez le voir. Et chaque image a trois canons, ou huites et huites. Et je peux prouver que vous pouvez utiliser ces syntaxes dans le Python et en utilisant OpenCV et vous allez avoir le numéro 3 comme les canons de l'image, donc chaque image a trois canons. Mais la question est que, est-ce que nous avons besoin de trois liens pour l'image processer ? En fait, non, nous n'avons pas besoin de trois liens. La processation des trois liens peut être difficile, et cela peut prendre beaucoup de temps pour procéder, ainsi que nous n'avons pas besoin de trois liens, parce que chaque trois liens a une similaire attribute, donc nous pouvons procéder juste par l'un d'entre eux. Donc la solution est que nous pouvons changer notre image de l'image à gris. Après cela, nous allons faire juste un canal et cela peut être facile de procéder et de comprendre notre image mieux. Alors le premier step dans l'image processation est de tourner notre image de l'image à gris. Après cela, nous avons une matrix comme cela. Comme vous pouvez le voir, dans cette matrix, nous avons des numéros de 0 jusqu'à 255, je veux dire de 255. 0 c'est noir et 255 c'est noir. Et n'importe quel numéro entre eux peut impliquer un couleur gris. Mais comme vous pouvez le voir, nous avons un numéro différent et distingue. Et cela peut être confusé un litre. Donc nous devons nettoyer ce numéro un litre. La solution est que nous devons appliquer un filtre bleu sur notre image pour nettoyer les numéros dans la matrix. Alors le deuxième step dans l'image processation est de appliquer un filtre bleu pour nettoyer les numéros dans la matrix. Mais comment pouvons-nous appliquer un filtre bleu ? Je veux dire, comment pouvons-nous appliquer un filtre bleu sur l'image ? Tout d'abord, nous devons créer une matrix de kernel. Avant de l'expliquer plus, j'ai décidé de l'expliquer ce que c'est de la matrix de kernel. Comme vous pouvez le voir ici, c'est l'image matrix, c'est-à-dire les pixels de source. Et ici nous avons une matrix de kernel. La matrix de kernel est une matrix que vous pouvez appliquer sur le pixel de source. Et les numéros dans la matrix de kernel peuvent être différents sur le filtre que vous voulez utiliser. Par exemple, vous pouvez utiliser des différents kernels pour appliquer un filtre bleu ou un filtre bleu, un filtre embassé ou un filtre bleu. Et vous n'en avez pas. Ici, je vais vous montrer un peu de la matrix de kernel que vous pouvez appliquer sur votre image. Par exemple, pour le filtre bleu, vous devez avoir une matrix de kernel comme celle-ci. Et pour le filtre bleu, par exemple, vous devez avoir une matrix de kernel avec des numéros similaires. Et les numéros doivent être plus petits que 1. Et par exemple, ici, 1,9 cross dans le vin, cross sur les éléments dans les matrices. Et après appliquer la matrix de kernel, chaque élément sera différent après cette équation. On va revenir dans le filtre bleu. Pour le filtre bleu, nous avons une matrix de kernel. Et la size de la matrix de kernel peut être différente. C'est à vous. Comment beaucoup de filtre vous avez besoin ? Par exemple, ici, j'ai appliqué un autre size de filtre bleu sur ma image. Et vous pouvez voir les outils et les différences entre eux. Par exemple, ici, c'est l'image originale. Et pour le second filtre bleu, nous avons une image bleue avec des numéros de kernel, la size est 3 et 3. Et pour le troisième filtre bleu, nous avons un autre image bleue. Et la matrix de kernel que j'ai appliquée sur eux est 5 et 5. Et vous pouvez le voir. Et comme vous pouvez le voir, le plus grand, le plus grand bleu. Après le filtre bleu, après l'image bleue, nous avons besoin de trouver l'âge dans notre image. Nous avons besoin de trouver tous les âges dans notre image pour trouver nos objets ou nos targets. Donc, nous avons besoin d'appliquer le filtre bleu sur notre image pour trouver tous les âges sur notre image. Donc, le troisième step dans le processus de l'image est d'appliquer le filtre bleu sur notre image pour trouver tous les âges sur l'image. Et après ça, nous pouvons détecter notre target. Mais avant d'expliquer plus sur le filtre bleu, j'ai décidé de vous parler de l'âge. Qu'est-ce que l'âge sur l'image ? OK. Les âges dans l'image. Tout le signifiant des différences entre les éléments dans la matrix. Je veux dire que tous les âges sur l'image et les âges sur l'image peuvent être une âge dans la matrix. Par exemple, dans cette picture, j'ai appliqué le bleu et le filtre bleu sur notre image. Et vous pouvez voir la matrix de notre image. Et comme vous pouvez le voir, nous pouvons trouver notre numéro dans la matrix. Mais pour le trouver avec le computer et avec le système, nous devons trouver tous les âges. Les âges sont augmentées ou diminuées. Par exemple, ici, nous avons une âge de 5. Nous devons retourner au 117. Ici, nous avons une âge. Ici, nous avons une âge. Ici, ici et tout ceci. Et comme vous le savez, après trouver tous les âges, nous pouvons détecter notre target. Par exemple, ici, notre target est 8. Et nous pouvons détecter 8. Et aussi, nous pouvons tourner notre image sur le bleu. Donc, nous devons obtenir 8 sur notre image. Pour le filtre bleu, nous devons appliquer le filtre bleu dans deux directions. Le premier est horizontal et aussi vertical. Parce que, comme vous le voyez, les âges peuvent être en horizontal. Par exemple, ici, ici et aussi, ce qui peut être vertical. Par exemple, ici et ici. Donc, nous devons considérer ces deux directions. Et après trouver tous les âges, nous devons obtenir une image comme celle de notre bleu. Comme vous le voyez, nous détectons notre target et aussi, nous avons trouvé toutes les âges dans l'image. Le deuxième topic est la vision des smartphones. Pourquoi nous avons besoin de vision des smartphones et pourquoi nous avons utilisé la vision des smartphones ? Par exemple, considérez-vous qu'il y a de deux âges. Ils jouent tous les jours avec un bleu, avec un bleu bleu. Si quelqu'un n'a pas le bleu bleu, c'est un renard. Et ils jouent 50 fois dans un jour et ils jouent 7 jours par semaine. Donc après une semaine, vous avez 350 pictures. Pour une picture, c'est facile. Vous pouvez juste regarder l'image et trouver le victime. Par exemple, ici, Simi est le victime parce qu'il a le bleu bleu. Mais quand vous avez trop de pictures, c'est difficile pour vous de juste regarder toutes ces pictures et de trouver le victime. C'est mieux pour vous de créer une vision des smartphones pour trouver la vision automatique. Donc, nous devons... Nous devons passer à cette étape. Le premier, nous devons utiliser l'image de la processation et tourner l'image RGB à l'image grise pour avoir juste une chaîne. Et le deuxième point est que nous devons nettoyer toutes les numéros. Donc nous devons appliquer le bleu bleu et le bleu. Nous devons trouver toutes les âges. Donc nous devons appliquer le canon. Et la deuxième étape et la dernière étape dans l'image de la processation, nous pouvons prédiquer où nous pouvons prédiquer où nous pouvons prédiquer où nous pouvons prédiquer où nous pouvons prédiquer. Par exemple, nous pouvons prédiquer où nous devons être dans la milieu de la photo pour pouvoir couper le centre de la photo et pour transmettre cette photo à l'input de la vision des smartphones. Vous pouvez voir les procédures. Le bleu. Par exemple, ici nous avons un image original, seconde, le premier point nous devons appliquer le filtre grise. le deuxième filtre, j'ai appliqué le filtre bleu pour le troisième, j'ai appliqué le filtre canon pour trouver toutes les lignes, comme vous pouvez le voir, et aussi j'ai proposé que les dogs doivent être ici, donc j'ai appliqué cette masse sur cette image pour remettre tous les extra details, par exemple, ce détail est extra et nous avons juste besoin de cette partie de la picture. Et maintenant, nous pouvons utiliser la vision d'un computer. La vision d'un computer va chercher, on va essayer de trouver un bleu et qui a le bleu est la victoire. C'est la vision d'un computer, mais nous avons des problèmes ici. Le premier est que cette vision d'un computer n'est pas générale. Par exemple, vous pouvez partager votre vision d'un computer autour de l'autre, parce que ce n'est pas très bien travaillé. Le deuxième est le bleu. Par exemple, si j'utilise le bleu position, et j'utilise une masse autour de l'autre, donc mon vision d'un computer ne va pas travailler, parce que la vision d'un computer ne va pas pouvoir trouver un bleu. Le troisième objectif est que si nous changez l'objectif, donc la vision d'un computer ne va pas pouvoir trouver la victoire. Et aussi, nous avons les autres problèmes. Ici, il y a l'intelligence artificielle, la combination d'image, la vision d'un computer, l'algorithme et l'algorithme machine-learning, pour vous aider à généraliser le système comme un magique. Ici, nous avons besoin d'intelligence artificielle. Par exemple, comme vous pouvez le voir, c'est un système comme notre cerveau qui est intelligent, raisonnable et accurate pour prendre une décision. Il s'applique constantement en regardant les choses autour d'elle, ce n'est rien, mais les données et les connaissances de l'attentive sont un knowledge avec des réponses et des expériences que l'on a appris à l'heure. Juste comme vous avez créé, comme vous avez créé par le système d'éducation où votre professeur vous a appris des images pour différencier les choses mondiales par ressentir votre cerveau avec deux impôts. Il y a l'image et la seconde description correcte des features, comment elle ressemble et où elle est située dans l'image. l'intelligence artificielle est un bâtiment de plusieurs liens juste comme un bâtiment d'éducation. Dans l'une des liens et l'autre des liens, il s'agit d'une vision computer. On a beaucoup de vision computer dans l'une des liens. C'est l'intelligence artificielle. L'algorithme computer qui travaille est d'extraire les features de l'image. Dans les premières liens, on extracte des features de l'amortisseur lait à l'air pour l'image et ensuite pour les collabiner tous les features extractées dans chaque pièce. Il apprécie d'établir un œil, un apple, un pô, et tout ce dont vous voulez. C'est l'intelligence artificielle pour aider à généraliser votre vision computer. Et je veux dire, le monde est incroyable. Et si vous avez une question, vous pouvez m'occuper de moi dans ma LinkedIn. C'est mon nom de NewZone, et vous pouvez me trouver dans la LinkedIn. Et merci pour votre attachement. Merci. Merci, Mohammed Amin. Je vais vous donner une question pour Yannick. Yannick, je vais vous donner une question pour Mohammed Amin. Excellent. Merci, Mohammed Amin. Et tout le monde, s'il vous plait, vous pouvez me poser vos questions dans les commentaires YouTube, ou sur Slack. Nous sommes dans le meeting de la chaîne. Et ça va me faire plaisir de relayer ces questions à notre représentateur, Mohammed Amin. Alors, quand les gens pensent sur leurs questions, j'ai une question. Vous avez montré beaucoup de... Je dirais beaucoup de... Je dirais beaucoup de... Je dirais beaucoup de... Je dirais beaucoup de... Je dirais beaucoup de... Je dirais beaucoup de... Vous avez montré beaucoup de... Je dirais beaucoup de... Je dirais beaucoup de processus intensifs. Et Python n'est pas fameux pour être performant, et en processant de nombreuses. Qu'est-ce qu'il y a de performances, d'improvéments, de stratégies que vous utilisez pour faire cette vision computer efficace en utilisant Python comme votre langue. En fait, j'utilise OpenCV et OpenCV dans Python. Qu'est-ce que c'est exactement votre question ? Je suis juste inquiétant est-ce que le système est rapide parce que Python n'est pas renommé à être particulièrement rapide pour le nombreuse. Et vous avez beaucoup de nombreuses pour le pipeline que vous avez montré. Vous allez révisiter probablement quelque chose sur l'ordre de 15 pixels pour chaque pixel que vous comprenez l'image bleue. Et ça semble être la plus facile partie du pipeline. Alors, comment est-ce que c'est rapide ? Et quelles stratégies est OpenCV utilisant pour faire cela efficace en Python ? On peut utiliser différentes intelligences artificielles en combinant avec la vision computer pour détecter tous les objectifs et faire tous les rebonds. Par exemple, il y a des cascades et différentes libraries dans Python et dans OpenCV que vous pouvez utiliser. Excellent. Alors, je vais juste clarifier parce que je pense que j'ai compris mais je veux être sûr que j'ai compris que tout le suivant de la maison a compris. Alors, c'est pour le filtre bleu que vous implementez le filtre bleu pour vous-même. Est-ce que c'est pure Python ou est-ce que vous allez avec Python ou un peu non-py pour speed up le processus ? Oui. C'est toujours une bonne stratégie. Excellent. Donc, on n'a pas encore des questions mais je vais vous demander une autre fois. Tout le suivant de la maison, ne soyez pas fiers. Vous pouvez poser vos questions à Mohamed Amir. Et je vais voir si j'ai une autre question. Alors, j'ai une autre question. Alors, j'ai une autre question. Alors, j'ai une autre question. Alors, j'ai une autre question. J'ai une autre question. Vous avez une autre question. Où devraient les gens faire le premier intro pour quelque chose comme OpenCV ? Qu'est-ce que vous venez de votre ressource préférée ? En fait, j'ai vraiment recommandé YouTube. Par exemple, ils peuvent chercher une course full pour OpenCV ou l'image processing. Et ils peuvent apprendre tout ce qu'il y a et tout ce qu'il y a dans YouTube. Et c'est vraiment très curieux. Oui. Excellent. Mais, on ne va pas avoir de question. Alors, je vais assumer que c'est parce que vous vous présentez tout extrêmement clairement. Merci d'être là. Merci. Alors, merci Yanik et Mohammed. Amir. Merci. Si. Ok. C'est ça. Notre prochaine présentateur, c'est FGNA qui est notre partenaire donc on est très content de la voix. Our next presenter is the ICO of FGNA. Bonjour tout le monde. Excuse-moi parce que là aujourd'hui mon internet est un peu lacké. En tout cas je vais te laisser prendre le contrôle, ok? On se parle tantôt. Donc oui ce soir je vais essayer de vous faire une introduction à la gestion des tâches asynchrones dans une application web Django. Donc l'idée c'est vraiment de faire une introduction légère pour ceux qui ont l'habitude d'en faire ou qui se posent un petit peu des questions sur les time-outs etc. parce que c'est souvent que je vois ça dans les chats au niveau de Python et particulièrement avec Flask ou Django. On va parler des tâches asynchrones dans un web principalement. Ça ne sera pas fait pour faire des classes pure en logiciel Python. Je vais présenter quelques packages en Django mais vous pourriez facilement l'adapter pour travailler avec Flask notamment ou avec d'autres frameworks en Python parce que la plupart des choses sont fonctionnelles. Il y aura juste quelques packages de base juste pour Django mais vous n'êtes pas obligé de l'utiliser. Juste pour une mise en contexte, moi je m'appelle Noël Rignon. J'ai fait un baccalauréat en ingénieur et en logiciel. Je suis le CEO de FGNR depuis 5-6 ans. Si vous avez des questions après la présentation, vous pouvez me contacter sur mon guide, mon link cut-in ou sur le Slack de Montréal Python, je suis toujours connecté dessus. Donc n'hésitez pas après la présentation, dans la soirée ou dans les prochains jours si vous avez le courage d'aller commencer à faire une intégration sur un de ces outils. Ça fera plaisir de vous aider. Pour ce soir, le sommaire est assez simple. Le début c'est une notion d'asynchronisme. On va voir un petit peu les différents types d'asynchronisme qu'on peut retrouver dans du web. On va regarder aussi un petit peu notre serveur web parce que de base lui-même est asynchronous. Donc voir un petit peu les limitations qu'il a et pourquoi on a besoin d'avoir autre chose. On va regarder ensuite une introduction à Celeri qui est un des systèmes les plus connus pour faire des tâches à synchrones en Python et particulièrement dans le web. Puis on va finir avec des notions sur des tâches à synchrones sans fin. Des tâches qui sont vraiment très très grosses, qui ont besoin d'un flux en continu comme du traitement de vidéo par exemple. Puis là on va voir comment on pourrait faire un démon Linux maison. Ce qui peut faire peur au début mais qui est extrêmement simple à faire finalement et comme ça on pourra le connecter avec notre application Django. C'est parti. Donc pour les notions d'asynchronisme, on va peut-être commencer par une définition. Donc l'asynchronisme selon Wikipédia, qui est mon encyclophytique préféré, ça désigne le caractère de ce qui ne se passe pas à la même vitesse que ce soit dans le temps ou dans la vitesse proprement dite par opposition à un phénomène synchron. Alors je la trouve un peu complexe pour pas grand chose. Principalement ce que ça dit c'est qu'il y a deux types d'asynchronisme. L'insynchronisme qui se passe sur une notion de temps et l'insynchronisme qui se passe sur une notion de vitesse. On pourrait voir ça par exemple avec deux types d'employés. Un qui va aller éditer des fichiers Word par exemple le lundi et l'autre qui va aller modifier le même fichier le mercredi. Donc ils ne travaillent pas forcément de manière synchron. Ils vont exécuter des tâches à des moments donnés sans se concerter, sans se synchroniser. Donc on va avoir un asynchronisme de temps. Elles peuvent se lancer quand elles veulent. Tandis qu'on va avoir de l'asynchronisme qui est plus sur les questions de vitesse, c'est-à-dire que les tâches vont pas toujours prendre le même temps et donc on n'a pas forcément de prévision pour savoir quand lancer la suivante, etc. parce qu'on n'a pas vraiment de notions là-dessus. Donc c'est un petit peu des défis qui vont pouvoir se régler avec l'asynchronisme. Les systèmes asynchrones se présentent souvent souvent de worker. Certains vont parler de trade, d'autres vont parler d'instances. Moi j'aime parler en worker comme on le trouve souvent sur les documentations officielles de plus en plus ces dernières années. Ce qui est intéressant avec le worker, c'est que ça représente assez la réalité. C'est à dire qu'un worker sera un agent en français. L'idée c'est d'avoir une quantité de travail possible par un agent, un worker, une personne. Si vous voulez par exemple avoir 5 agents qui peuvent travailler, vous aurez 5 workers, il pourrait ensuite être toutes les 5 sur le même serveur, sur des trades différents. Par exemple vous avez un gros CPU avec plusieurs coeurs à l'arrière pour pouvoir faire des calculs ou vous pourriez très bien être beaucoup plus moderne sur le cloud avec des serveurs qui pop à la demande et donc vous auriez 5 serveurs qui vont être là pour répondre à différents requêtes. Donc ça va vous permettre de scaler horizontalement en montant de nouveaux serveurs ou verticalement en montant la puissance de votre serveur que vous avez déjà. Vous pourriez même mettre par exemple sur 5 workers, 2 workers sur un petit serveur avec un dual core et puis un 3 workers sur un autre serveur qui a un plus gros CPU. Donc c'est ça qui est intéressant quand on parle de worker. Les workers, on va les suivre dans le temps pour jouer des tâches en synchrone et l'idée c'est de leur donner des tâches. Donc dès qu'on a une première tâche, généralement la règle par défaut c'est on regarde le premier worker, s'il est libre, on lui donne une tâche. Puis si on a une autre tâche qui arrive, si le premier est déjà occupé, on la donne au deuxième puis ainsi de suite pour le troisième. Et si par exemple on a une quatrième tâche qui arrive et que les deux premiers sont toujours occupés mais que le troisième est déjà libre, on va pas passer au quatrième, on va juste re-remplir le troisième. On essaye toujours de remplir les premiers de la liste en priorité, c'est souvent la règle par défaut. Et donc par exemple si une cinquième arrive, ici on voit que j'ai mon deuxième et troisième qui sont déjà occupés, donc on va remplir le premier. Ça c'est le principe de base qu'on va retrouver sur Celeri. Par exemple avec la configuration par défaut, c'est aussi le principe qu'on va retrouver sur Unicorn par défaut, etc. Qu'est-ce qu'on peut faire rouler sur des tâches à synchrone concrètement quand on travaille sur du web ? On pourrait par exemple penser à des systèmes d'archivage. Donc on pourrait imaginer par exemple aller supprimer des ordres que vos clients ont fait sur votre boutique en ligne à chaque fin de mois histoire de pas avoir des millions et des millions de lignes parce que vous faites beaucoup de ventes. On pourrait aussi par exemple penser à l'archivage des logs parce que dans les logs c'est possible que vous étudiez beaucoup beaucoup beaucoup de données. On pourrait aussi penser à des courriels de relance. Contrairement au système d'archivage qui se passe tous les soirs ou toutes les fins de mois, le courriel de relance, il se lance peut-être 7 jours après la date à laquelle le client était censé payer. Donc là déjà on a une notion de temps qui est plus dynamique. On peut avoir des générations de factures PDF par exemple. Donc là on est vraiment sur du transactionnel. Ça veut dire qu'au moment où la personne paye tout de suite il faudrait générer une facture PDF mais ça peut prendre un certain temps donc on préfère peut-être le faire de manière à synchrone. Ou on pourrait avoir par exemple des calculs de statistiques journalières qui se rapprochera un peu plus du système d'archivage. Tout ça on pourrait le faire avec des calls web comme on le fait d'habitude. C'est souvent ce que je vois chez les gens qui débutent avec Django ou avec Flask. C'est que souvent ils vont faire tout simplement un call puis ils vont dire à tous les soirs je vais faire mon petit appel ou alors je vais faire une cron job qui va faire un call par exemple avec curl pour faire un call HTTP et récupérer l'information et la stocker. C'est cependant un peu lourd parce que si on se base sur du web on va avoir des limitations notamment les time-outs à 30 secondes et si on les augmente ça va impacter tous nos clients. Donc si on prend par exemple l'exemple de notre génération de facture PDF et qu'on a notre server web, qu'on a un trade qui nous permet de gérer notre server web et puis on fait une requête avec un client qui va donc finaliser sa commande ça va changer les stocks, valider que sa commande soit réaliste, faire le paiement donc peut-être contacter Stripe ou PayPal et puis à la fin ça va aussi générer une facture PDF et l'envoyer par email au client. Et c'est seulement une fois qu'on aura fait tout ça qu'en général il va renvoyer une réponse au client et lui dire hey c'est bon ta commande a bien fonctionné. Mais générer un PDF, envoyer un email, regarder les stocks etc ça peut facilement prendre 2 voire 3 secondes des fois selon la taille du PDF et le nombre d'informations qu'on a besoin de faire. Ce qu'on pourrait faire à la place c'est mettre un server web avec un gestionnaire de tâche à synchrone. À ce moment là on va pouvoir faire la validation de la commande vérifier qu'elle fasse du sens, qu'il n'est pas triché à un moment sur le frontend faire la validation du paiement et peut-être l'update des stocks en même temps de manière atomique sur notre base de données. Et on va tout de suite pouvoir répondre au client lui disant oui c'est bon ta commande s'est bien passé on te met un petit message de succès, une petite animation jolie en récompense positive et puis on peut continuer sa journée. Et tout de suite à synchrone on va faire rouler un note worker pour générer le PDF et l'envoyer au client puis peut-être aussi mettre un jour les statistiques mensuelles pour les administrateurs. Ça permet déjà ici de faire gagner beaucoup de temps à votre client il n'aura pas de time out parce qu'il n'aura pas dépassé les 30 secondes mais en plus de ça il va avoir des pages qui vont répondre beaucoup beaucoup plus vite et vous de votre côté puisque vous avez beaucoup plus de temps et ça n'impacte pas les utilisateurs on est capable de faire rouler beaucoup plus de choses en tâche à synchrone et d'aller faire plus de systèmes automatisés pour bien satisfaire vos besoins journaliers administratifs. G Unicorn par défaut qui est pour ce qui ne le connaissent pas un système permettant de transférer le WGI donc un protocole permettant de faire rouler du Python en version web en tant que serveur HTTP donc c'est vraiment un transformateur WGI serveur HTTP et capable déjà de travailler avec le worker ça peut même se définissent comme un pre fork worker model donc le pre fork veut juste dire qu'en fait ils ont des agents qui sont déjà gérés à l'avance parce qu'ils ont un système dynamique de création des workers et du coup s'ils voyent par exemple que vous avez deux workers mais vous êtes déjà à 80% du total de puissance il va ouvrir un troisième worker pour vous permettre si il y a une requête supplémentaire peut-être capable d'y répondre vite il sera déjà initialisé, il sera déjà chargé en mémoire et c'est capable de répondre tout de suite dès que la requête va arriver GU Unicom est donc déjà à synchrone il a déjà un système de worker d'ailleurs sur leur documentation souvent les gens, je le voyais le configure avec 3 workers par défaut parce qu'ils copient ce qu'on trouve sur les documentations comme digital, océan ou autre mais en réalité normalement on peut faire rouler beaucoup plus que ça parce que leur documentation indique qu'on peut en faire rouler comme 2 fois le nombre de coeurs CPU qu'on a sur notre machine donc si vous avez juste un coeur vous êtes capable de faire rouler 3 agents déjà si vous avez deux coeurs où vous pouvez faire rouler 5 puis par exemple vous avez un quad coeur vous êtes capable de faire rouler 2 fois 4, 8 plus un 9 agent au total tout ça c'est de manière approximative ce n'est pas une formule scientifique comme ils le disent très bien mais ça vous donne un ordre d'idée un peu de ce que vous pouvez faire rouler le problème c'est qu'avec GU Unicom on va voir exactement le problème qu'on a vu avant si vous le considérez comme un système à synchrone comme certains le font parfois c'est vrai qu'on peut juste augmenter les timeouts de GU Unicom puis nos requêtes pour comprendre 40, 50, même 300 secondes des fois pour répondre par exemple à des tâches d'export d'une part vous êtes en train d'utiliser les workers qui étaient mis à disposition pour vos utilisateurs normaux qui ont juste besoin de call de quelques millisecondes pour récupérer des informations sur votre API ou sur votre site web donc vous prenez de la puissance là où normalement elle est faite pour des utilisateurs de deux vous êtes en train d'augmenter les timeouts si votre agent tourne en rond à cause d'une loop infinie ou d'une erreur de code il va attendre jusqu'à la fin du timeout avant d'échouer et donc finalement vous avez occupé l'agent très longtemps pour strictement rien donc bien qu'il soit à synchrone il n'est pas du tout optimisé pour l'utiliser en tant que gestionnaire de tâches à synchrone il est vraiment fait pour répondre à des courtes requêtes et il utilise la synchronise pour mieux gérer les requêtes on en vient donc qu'il y a une introduction à Celeri qui va être la réponse à notre problème pour pouvoir justement toucher les tâches à synchrone de type génération PDF en voie d'email etc Celeri alors ils ont la petite définition bateau il est simple, il est flexible, il est reliable il a tous les avantages du monde mais c'est surtout un gestionnaire pour envoyer des messages en grande quantité il n'est pas présenté comme un système de tâches à synchrone d'ailleurs il ne l'est pas c'est un gestionnaire de messages qui vient par-dessus à un gestionnaire qui généralement est un MQTT par exemple RabbitMQ qui est un protocole très très léger qu'on utilise beaucoup en domotique et qui permet justement d'avoir des salons, discussions pour faire du public subscribe qui est capable d'envoyer des messages et de subscribe dessus pour les détecter Celeri en fait est une surcouche qui permet de venir récupérer donc par exemple depuis un serveur RabbitMQ directement d'écrire et lire des messages puis de le reporter sur du Python Celeri va nous offrir deux outils majeurs la gestion de tâches et la gestion de bits la gestion de tâches s'apparente un petit peu à la notion de vitesse qu'on a vu au tout début ça veut dire que c'est juste une queue de tasques qui va être mise à disposition et les agents, quel qu'en soit le nombre dès qu'ils ont fini une tâche ils vont regarder dans la queue si il y a une autre tâche à faire et ils vont se l'assigner et commencer à travailler dessus donc ils vont les faire aussi vite que possible le bits, tant qu'il y a lui et plus sur la notion de temps ça veut dire qu'il va plus s'approcher d'une crown job ça veut dire que vous êtes capable de dire le premier lundi du mois à 8h du matin exactement exécutes telle ou telle tâche donc c'est vraiment deux notions différentes on le verra le code est très similaire, c'est à dire que une tâche que vous l'utilisez dans une queue une fois qu'elle a été écrite vous pouvez l'utiliser avec un bits il y a juste un petit code en plus pour lui dire en plus cette tâche là exécute là à tel moment sinon vous pouvez juste dire exécutement cette tâche là tout de suite donc c'est les deux notions qui vont être apparentées une tâche celerie ça se propose de manière très très très simple vous avez un petit package que vous installez avec votre gestionnaire comme pipe par exemple dans Django on va même avoir un utilitaire qui s'appelle charttask qui va vous permettre de les auto détecter donc vous n'êtes pas besoin de les référencer tout dans un fichier du moment qu'il va trouver ce décorateur de fonction il va être capable de référencer toutes les fonctions toutes les tâches pardon de votre code et il va être capable du coup après les utiliser à d'autres emplois et donc par exemple ici vous voyez un exemple vous avez un décorateur charttask la fonction Python avec un attribut celle-ci permet d'envoyer un email de confirmation quand un client par exemple pardon quand un administrateur a fait un remboursement un client donc vous avez fait une commande ou quelque chose c'est mal passé on va faire votre jouet à ce moment-là il va pouvoir faire un refund on va garder cet ID on va le prendre en paramètre et on va être capable grâce à l'ORM donc on a toute la puissance de Django en arrière de retrouver le refund et d'appeler une fonction par exemple qui serait dans le modèle de cet objet donc en quelques lignes seulement on peut faire une tâche à 5€ et du côté de l'usage ça reste aussi très simple donc imaginons on a une fonction qui permet de finaliser le refund c'est un vue administrateur ça peut être dans une vue, un modèle, un serializer peu importe on va juste avoir à faire une ligne en disant le note d'autre fonction point delay pour lui dire de l'exécuter plus tard et on va lui donner les attributs dont on a besoin par exemple là on a le self.id le paramètre pardon self.id qui va se retrouver ici on peut exécuter plusieurs tâches à 5€ en côte à côte par exemple ici on voit qu'on en exécute une puis l'autre par contre on ne pourra pas garantir leur ordre d'apparition ou du moins leur ordre de finalisation parce que c'est possible qu'un worker prenne la première que ce worker soit très lent pour une raison obscure la deuxième commence se finit avant la première puis finalement etc donc il n'y a pas vraiment d'ordre comme on l'a d'habitude avec Python, c'est plus à synchrone je suppose que ça reproche tout ceux qui ont l'habitude de JavaScript c'est que les fonctions ne savent pas trop qu'on le sait terminer mais c'est relativement simple du côté de Django particulièrement vous pourriez retrouver un package qui vous aidera énormément qui s'appelle Django Celeri Results ce que vous avez ici qui vous permettra de retrouver toutes les tâches qui ont été générées par Celeri et donc qui sont sur votre serveur RabbitMQ qui est une dépendance système qui va être installée et donc de les référencer directement dans votre Django admin ce qui est beaucoup plus simple c'est qu'il y a l'aise avec des technologies comme Flower par exemple pour aller analyser votre trafic RabbitMQ ce qui est beaucoup plus complexe qui demande quand même un petit ramp up il est très bien fait ça vous permet de retrouver toutes vos tâches avec ces UID de voir quelle fonction de votre code a été exécutée quand est-ce qu'elle a été exécutée c'est quoi son statut donc vous avez plusieurs statues comme le failure, painting, resaved, retry, revoked, started success mais aussi quel worker l'a exécuté par exemple on voit que c'est le worker numéro 1 puis à chaque fois d'ailleurs salé mais s'il y avait plus de tâches qui se lançaient un petit peu en même temps le worker 2 pourrait apparaître de temps en temps ça vous permet aussi de pouvoir filtrer par exemple par tâches pour aller voir quand est-ce que c'est exécuté la dernière fois cette tâche donc c'est vraiment pratique notamment parce que sinon RabbitMQ est juste un système de messagerie au même titre que Celeri et du coup il ne va pas forcément vous dire quel morceau de votre code a été exécuté ici il est quand même capable de faire le rapprochement avec votre code en vous disant exactement quelle fonction dans quel module Python donc c'est beaucoup plus simple d'aller débuguer vos informations de même si vous cliquez sur le détail le screenshot a pas plus petit mais c'était juste pour vous montrer une ordinatez vous êtes capable de retrouver les mêmes informations sur la liste mais vous pouvez aussi voir les arguments non nommés et les arguments nommés donc les args et les quarks de votre Python qui ont été fournis à la fonction ça vous permet de facilement pouvoir savoir qui a été exactement puis de le refaire localband pour aller débuguer le système le résultat qui a été retourné donc ça vous permet aussi de pouvoir loguer des informations et un trace back donc en cas d'erreur vous allez avoir comme vous l'avez en Python quand vous faites une erreur en général la liste des dernières lignes avec la raison pourquoi il a échoué et vous avez ça directement dans votre base de données tout ça c'est fait par Django Celery Results si vous avez besoin de faire des tâches asynchronous qui vont se lancer de temps en temps vous pourriez alors vous tourner sur Celery Pits qui est donc fait partie de Celery aussi et donc par exemple imaginons qu'on voudrait générer un inventaire du stock à chaque fin de mois donc à chaque fin de mois vous voulez juste faire un inventaire du stock en disant combien de fois vous avez l'itm A combien de fois vous avez l'itm B combien vous en avez vendu etc vous pourriez écrire juste ce petit morceau de code que vous mettez dans votre fichier Celery contre une petite configuration à l'installation et vous êtes capable de dire juste un nom que vous lui donnez pour référencement dans votre code quel est la tâche qui sera exécutée donc ici on voit que c'est exactement le même nom mais vous pourriez mettre autre chose et une instance de Chrome Tab qui vous permettra de scheduler votre tâche en lisant par exemple ici le premier jour de chaque mois à 0 minutes, 0 heures ce qui vous permet d'être sûr que le mois précédent est fini à la milliseconde près et là on va faire rouler un montagne inventaire c'est le Bits, encore une fois a un petit package pour ceux qui utilisent Django spécifiquement, ça s'appelle Django Celery Bits on n'en parle pas de Django Celery Results ce qu'on a vu avant qui vous permet de pouvoir voir toutes vos tâches Chrome si on veut toutes les bits et d'être capable de les consulter donc d'aller modifier un petit peu aussi le moment où elles vont se lancer ça vous permet aussi d'éviter d'écrire le petit morceau de code qu'on vient de voir juste avant qui est hardcoded dans votre plateforme notamment depuis votre panel admin ça vous permet notamment de pouvoir modifier vos tâches par exemple si vous avez des emails automatisés, de les mettre en pause si vous voyez qu'il y a un problème avec les envoies en ce moment vous pouvez aller arrêter le système facilement sans redéployer le code vous pourriez aussi aller changer des attributs, par exemple vous avez un template d'ID ou un template de PDF que vous voulez changer vous pouvez directement aller là-dedans, changer le paramètre au lieu d'aller le changer dans le code, encore une fois donc beaucoup moins besoin de déployer l'intérêt aussi de travailler avec celui-ci c'est que vous avez moins besoin d'apprendre directement les nomenclatures et les habitudes de codage du côté de la config parce que le bit peut gérer beaucoup beaucoup de choses il peut se lancer tous les intervalles de temps par exemple tous les 10 secondes, toutes les 10 minutes toutes les heures, tous les jours, tous les mois il peut aussi se lancer comme une crème tasse à certains moments, donc le premier jour du mois ou le septième jour du mois à quatre heures du matin mais il peut aller beaucoup plus loin donc on peut avoir des événements solaires donc au lever du soleil, au japon il est capable de vous dire le moment où le soleil commence à se coucher le moment où le soleil est complètement couché il est capable aussi de vous déclater par exemple une eclipse vous pouvez faire des événements un petit peu spéciaux par rapport à ça pour surprendre d'un point du marketing etc mais aussi tout simplement pour pouvoir envoyer ça au bon moment parce que souvent on veut par exemple envoyer un email avec la toute liste de notre utilisateur qui est l'étage de sa journée mais l'envoyer à 9 heures tous les matins si c'est une toute liste plus dans le perfectionnement personnel c'est peut-être pas pertinent par contre l'envoyer au moment où le soleil s'est levé le week-ends, ça peut être sympa ça peut être le moment où généralement il va commencer sa journée c'est beaucoup plus adaptatif dans certains cas donc tout ça est directement pris en charge si cependant vous aviez une tâche sans fin Céléry va très mal s'y poser on va le voir juste après pourquoi qu'est-ce qu'on pourra voir comme tâche sans fin typiquement du traitement de données venant d'un capteur si on parle de domotique vous avez par exemple une vidéo qui est en train de tourner, vous avez une caméra dans la rue ou chez vous puis vous voulez faire par exemple du computer vision comme on l'a vu tout à l'heure vous allez sûrement avoir besoin de faire un flux en temps réel c'est donc une tâche qui n'a pas de fin et là Céléry va avoir énormément de mal on pourrait aussi imaginer synchroniser deux entrepôts de données imaginons par exemple que vous avez un type Shopify sur lequel vous êtes des ventes d'ailleurs vous en avez plusieurs que vous voulez synchroniser ces shops pour faire des analyses financières sur votre plateforme Shopify va pas forcément avoir tous les accès sur leur API pour vous aider ou ça peut être un autre concurrent qui ne les ait pas donc à ce moment là vous pourriez imaginer faire un stem qui dès qu'il est disponible fait un appel pour voir s'il y a des changements s'il y a des changements les synchronise puis tout de suite après regarde encore s'il y a d'autres changements etc pour faire un flux réel puis s'il n'y a rien à faire il attend comme 10 secondes prenons un exemple typique que moi j'ai fait dernièrement c'est qu'on avait des photos puis on voulait reconnaître des émotions faciales dessus donc on avait des photos qui étaient mis dans un cloud storage on a une application de Django qui tourne puis on a une base de données et je veux juste aller voir ces photos faire un traitement dessus et selon les résultats stocker des résultats dans ma base de données ça peut être la détection du chien ou la détection du disque avec le cercle jaune comme on a vu tout à l'heure à ce moment là je pourrais essayer de le faire avec Céléry Task le problème c'est qu'on a plusieurs risques par rapport à ça d'une part je pourrais avoir des pertes de messages si mon système est en ligne imaginons mon système est en ligne une photo arrive dans le cloud storage puis j'ai un système qui va appeler Django pour lui dire hey j'ai une nouvelle photo il faut que tu l'en primes c'est comme ça qu'on va créer la tâche si mon Django est en ligne parce que je suis en train de faire un déploiement il y a eu un problème sur le server etc un moins que vous utilisez un système de pubsub puissant sur le cloud la plupart du temps vous n'aurez pas de système qui va garder ce message en mémoire pour quand vous allez revenir en ligne et donc vous risquez de perdre des messages et certaines photos ne vont jamais être exécutées donc ça c'est le premier risque le deuxième c'est la surcharge de la queue si vous avez par exemple huit photos qui s'ajoutent par second si vous êtes capable d'entraîner que deux toutes les secondes vous avez six photos en trop donc huit deux secondes vous en avez 12 puis huit trois secondes vous en avez déjà 18 puis à la fin de la journée vous en avez sûrement peut-être des millions et ces millions de photos vont chacune créer une tâche dans la queue qui sera en format texte juste pour dire va regarder telle fichier un texte est possible mais cette queue elle est gardée en mémoire sur votre serveur puis quand elle va grossir grossir grossir il y a un moment elle va exploser en quelque sorte ça va surcharger votre système et donc forcément il va s'arrêter parce que votre queue soit toujours capable de se vider dans un temps raisonnable et surtout ne surcharge pas le dernier risque c'est qu'est-ce qu'on fait si un des messages est perdu dans notre queue pour une raison x ou y ou si il échoue mais qu'on n'a pas été capable de le loger correctement pour savoir qu'il faut le refaire notamment on pourrait peut-être ouvrir la photo là on se rend compte que le fichier n'est pas trouvable, ça plante puis parce qu'on n'a pas dit qu'on avait pris la tâche quelque part dans notre tb avec un code custom la tâche elle était déjà en cours finalement on a eu un problème dans notre code on voit pas qu'il faut la refaire il y a une photo qui sera jamais traité donc là on est vraiment sur la gestion d'erreur Celeritasque est donc peut-être pas optimisé pour des tâches sans fin il va emmener plusieurs problématiques il va pas suffire à lui-même une deuxième solution ça pourrait être avec un Celeri Pits comme on l'a vu juste avant puis on a notre temps puis on se dit OK, prêter une photo ça me prend à peu près une heure je sais une grosse photo, il y a vraiment beaucoup de choses à checker et du coup je vais dire que toutes les heures je vais lancer une tâche pour exécuter une nouvelle photo donc la photo prendrait plutôt 50 minutes comme ça on se garde à une petite sécurité au début j'ai deux images qui sont déjà en stock et je lance mon système automatiquement mon système va prendre les deux premières photos il va les mettre chacune sur un agent ils vont commencer à travailler en parallèle l'un risque de finir peut-être plutôt claude selon la qualité de l'image etc parce qu'il n'aura pas exactement la même calcul à faire puis ensuite ils vont se mettre en pause puis à la fin de la première heure on va redétecter peut-être deux nouvelles images qui seront apparus entre temps il va les lancer jusqu'à là tout va bien le problème c'est qu'à la fin de notre deuxième heure si il n'y a toujours pas de photos il va lancer les tâches il n'y a rien à checker donc il va tout de suite s'arrêter parce qu'il aura fait un résultat et si on a des photos qui apparaissent seulement 5-10 minutes après il va falloir attendre la troisième heure donc peut-être 50 minutes plus tard sans rien faire avant d'exécuter les deux nouvelles images qui sont encore apparus donc là on a vraiment une mauvaise efficacité de notre système notre système avait une puissance de calcul possible mais il n'a rien fait pendant quasiment une heure puis il risque de faire ça plusieurs fois dans la journée et ça c'est le meilleur des cas le pire des cas c'est si certaines photos prennent plus d'une heure parce qu'au moment là qu'on va dépasser l'heure on va générer avec le bit deux autres tâches et on va quand même pas avoir fini l'autre donc on va avoir un manque d'agent disponible parce qu'il est toujours en train de travailler et on va se retrouver avec une pipeline qui va grossir donc notre queue va s'élargir le risque qu'on avait tout à l'heure en plus que c'est de temps en temps on a des trous il va récupérer que une ou deux photos de retard à chaque fois en imaginant qu'on ait des trous donc c'est vraiment pas optimal de ce côté là l'objectif qu'on aimerait avoir c'est quelque chose de beaucoup plus simple c'est chercher si on a une tâche si on a une tâche l'exécuter puis si on n'en a pas attend 10 secondes pour éviter de tourner trop trop rapidement boucler de stocker trop de logs puis surtout dans tous les cas rechercher une tâche ensuite pour voir si il y a encore du travail à faire donc c'est les rebits ou c'est les retasques semblent un petit peu overkill beaucoup trop complexe pour une tâche aussi simple pour ça il y a un système qui peut faire peur au début mais qui est pourtant très évident à mettre en place c'est de créer un demon linux et ça je le vois assez rarement les gens parlent tout de suite sur le cloud ils utilisent du pub sub, ils utilisent du multi instance ou alors ils font du céleri avec beaucoup de codes pour essayer de le gérer par dessus alors que finalement écrire un demon linux ça tient en une vingtaine de lignes et un fichier qui pourrait utiliser d'une centaine de lignes en vion un demon linux ça a plusieurs avantages d'une part vous allez être capable de le démarrer et l'arrêter à la demande au même titre que céleri ou vous pouvez le dire start ou stop ou que votre système MySQL ou que votre système unicorn ou et Jinx, vous pouvez toujours faire un système CTL start ou stop donc il va réagir exactement pareil le deuxième c'est qu'il va avoir un pitfile donc le pitfile c'est un fichier qu'on trouve sur tous les processus Unix qui est en fait un processus ID c'est un fichier dans lequel on va juste retrouver un numéro qui va être notre numéro de processus et qui nous permet de savoir si ce logiciel est déjà en train de tourner ou pas dans un processus système là il va avoir un fichier ce qui va nous permettre aussi de le traiter comme un processus et de pouvoir profiter de toutes les statistiques qu'ils vont avec capacité du processeur, capacité de la rame et des disques aussi contrairement à si ça tournait dans le Django où tout passerait sous junicorn ou et Jinx et du coup ça reste flou qu'est-ce qu'il utilisait par le système massacrone qu'est-ce qu'il utilisait par le suéateur qu'est-ce qu'il utilisait pour le reste un de ces gros aspects aussi c'est qu'il va devoir rediriger tous les streams d'outputs et vous rendre votre prompt donc quand vous allez le lancer vous allez faire un start de votre système automatiquement il va vous rendre votre command prompt pour garder votre fenêtre ouvert tout le temps sinon ça serait très pénible et il va rediriger tous les outputs dans des fichiers de logs même si vous avez des logs pour apache ou jinx les gros avantages de partir avec cette solution quand on est sur Django c'est que vous allez être capable de l'utiliser directement avec la commande de Django vous allez être capable de faire python, manage.pi par exemple sinker si vous voulez appeler sinker start ou stop ou restart déjà ça va être très facile à utiliser puis vous allez être aussi capable d'utiliser l'ORM de Django donc encore une fois on n'a pas un autre système qui tourne à côté et qui va peut-être utiliser directement la base de données avec des commandes SQL ce qui serait vraiment très déconseillé sachant que Django a son propre système de schéma et que du coup avec l'immigration pas c'est possible que la base de données change de forme donc là on utilise l'ORM de Django on a vraiment quelque chose de clé en main qui rentre dans le système on a presque l'impression de faire du web les demons linux comme là je vais vous le présenter sont basés sur un livre qui s'appelle Advanced Programming in the Unix Environment dont vous avez le code ISBN ici sur la présentation je pourrais vous la donner à la fin sur le Slack si vous voulez puis c'est ça que je propose qu'on regarde rapidement ensemble tout de suite donc je vous ai mis le lien d'un guiste parce que je trouve très pratique à utiliser il est déjà en ligne, il n'y a pas besoin d'un compte GitHub il est très anoté, il y a des sources etc donc je le trouve en pratique pour commencer l'idée c'est tout simplement d'avoir une classe donc vous avez une classe qu'on va par exemple appeler demon qui va être une classe générique que vous allez devoir ériter et sur laquelle vous allez devoir surécrire un certain nombre de fonctions notamment la fonction run simplement qui sera la seule qui est vraiment nécessaire cette classe va être capable de tout faire pour vous quasiment ça veut dire qu'elle va rediriger les flux de sortie notamment le SDIn, SDOut, SDError donc le standard input et le standard error qui sont les trois flux génériques pour les STEM Unix il va aussi s'occuper de gérer le pitfile pour vous et il va disposer d'une fonction demonize qui va faire un système de double fork qui sera détaillé dans le livre si vous voulez en apprendre plus mais qui vous permet donc de vous rendre votre prompt de gérer les erreurs séparément et de vraiment relancer un système lignuux que c'est au même titre que quand vous lancez MySQL donc tout le système est déjà ici on voit que c'est pas très dur à lire c'est à dire qu'il fait un try il essaie de faire un fork avec son OS donc ça marche que sur Unix il va gérer les erreurs il va essayer de découpler le système que vous êtes en train de faire rouler de l'endroit où vous étiez actuellement donc il va pas se soucier du dossier dans lequel vous étiez, il va faire comme s'il était à la racine il va aussi faire son deuxième fork il va diriger donc ses flux et il va écrire son pitfile il va vous proposer quelques fonctions clé en main pour pouvoir l'utiliser notamment le start the demon qui va donc appeler le demonize qu'on vient de voir et la fonction run le stop qui va supprimer le pitfile remettre les flux etc un restart qui fait juste un stop et un start et une fonction run qui doit être overwrite pour faire ce que vous voulez parce qu'il sait pas exactement qu'est-ce que vous voulez faire rouler je vous laisserai regarder le gist en détail vous voyez il n'y a pas grand chose sa science sur une petite centaine de lignes grand maximum par contre c'est très facile à utiliser parce que du coup de notre côté on va juste se retrouver avec un demon linux comme celui-ci qui va être donc une classe qui si on va appeler sinker qui va éréter notre demon je lui ai rajouté une petite documentation pour être facile à utiliser de mon côté j'ai eu l'envie de rajouter un constant pour localiser un fichier de log que j'aurais pu mettre dans mon var hug ou ce que je voulais mais là je l'ai mis dans le temp juste pour faire mes essais j'ai su récrire ma fonction run pour faire une boucle infinie ce qui va être important et donc par exemple je lui ai dit while not kill now à ce moment là cherche une autre tâche à processer et si un jour je te dis d'arrêter maintenant tu retournes en dessous et tu t'arrêtes je me suis fait une petite fonction de write log bien propre parce que du coup on n'a plus d'affichage des erreurs si on a, on n'a plus d'affichage des succès non plus il n'y a rien, il n'y a vraiment plus d'output donc dans mon fichier de log je marque toujours le dead time donc le timestamp auquel ça s'est passé qu'est-ce qui s'est passé je vais utiliser cette fonction un peu partout pour mieux écrire trop de log que pas assez après on pourra toujours faire un système asynchrone à côté pour aller les nettoyer temps en temps ou les archiver et les compresser puis j'ai donc ma fonction proches next task qui elle va faire plein de choses donc là je voulais couper ce qui n'est pas forcément pertinent mais qui va par exemple aller justement trouver la prochaine tâche à faire puis la processer ensuite ce sinker il va être capable de faire rouler tout ce que vous voulez donc il sera capable par exemple de se connecter à un système de storage de lister les fichiers, les comparer votre base de données puis si il y a un nouveau fichier dedans il va le prendre comme une prochaine tâche l'exécuter sans computer vision ou ce que vous voulez dessus et tout simplement passer à la prochaine puis si vous l'arrêtez il va juste s'arrêter gracieux donc il pourra écrire quelques lignes de log pour dire que vous avez demandé de faire une interruption et puis il va s'arrêter et arrêter de consommer du cp vous pourriez même en faire rouler plusieurs côtes à côtes si vous le souhaitez ou faire un système de trade à l'intérieur rien ne vous empêche de mettre un système asynchrone avec des trades à l'intérieur de votre système ou sinon d'avoir un système de numéro de processus comme ça que vous lui donnez en argument quand vous le lancez avec votre commande et vous pouvez en faire rouler plusieurs côtes à côtes que vous pouvez start-stop manuellement donc ça c'est la solution qui vous permettrait de pouvoir faire rouler des tâches en continue ça l'introduction je voulais vous faire quand vous avez pu le voir junicorn est asynchrone mais n'est pas forcément fait pour donc quand vous voyez que vous utilisez des tâches comme je le vois souvent ou vous allez faire des curls ou autre pour aller générer des choses qui prennent plus de 30 secondes ou même qui prennent plus de quelques secondes seulement il vaut mieux penser à tout de suite passer sur un céleri et faut surtout pas avoir peur d'aller c'est de faire un demo Linux pour ceux qui sont intéressés qui voudraient aller voir le guide que je remis dans la présentation si vous avez des moindres questions hésitez pas j'ai beaucoup d'exemples de code de demo Linux comme celui-ci donc je vous propose de vous fournir quelques uns pour vous donner un petit peu des templates c'est pas mal ça merci Noël ok laisse moi oui yannick yannick je suis te laissé France Point de Noël je vous t'entends super merci beaucoup Noël alors comme plus tôt tout le monde faut vous poser vos questions sur Youtube ou sur Slack et puis ça me fait plaisir de les relier de Vivo et Noël, everyone you can ask your questions Youtube or on Slack I see there's one right now and I will be happy to really them out loud to Noël and you can ask them in French or in English it doesn't matter because we have a bunch of people able to translate those ok Noël première question de Jean-Philippe Brochu petite question de compréhension si par exemple nous aurions un seul worker disponible et il y a une tâche à synchrone pourrions-nous dire que la tâche sera traité de façon synchrone je pense que la question ici on peut la résumer est-ce qu'on peut avoir des tâches bloquantes tout à fait, c'est une très bonne question parce que souvent ça peut arriver qu'on est qu'un seul agent souvent on en met quand même plusieurs mais vous pourriez tout à fait le faire, il suffit de changer la config en soi elle sera quand même à synchrone, dans le sens que en Python, la moindre ligne qui va vous exécuter, que vous appelez une fonction, vous appelez une autre classe ou une fonction à l'intérieur tout ce code doit être exécuté avant de suivre la fonction la ligne qui vous aviez à la suite de cette ligne là au début donc ça peut vraiment faire comme un gros fork puis vous allez avoir 3000 lignes de code avant de faire la suivante ce qui n'est pas du tout le cas par exemple pour ceux qui font un peu de JavaScript ou quand vous appelez une fonction qui vient d'ailleurs vous avez vraiment un autre trade qui se lance puisque votre CPU peut pas en gérer des milliers il va plus ou moins les faire un peu en même temps c'est le premier l'état dans lequel vous serez pendant vos traitements si vous utilisez la même ressource de ce côté là on peut pas dire que ça va être synchrone parce que puisque vous lancez un worker on sait d'une part pas quand est-ce qu'il va se lancer ça dépend combien de tâches vous avez déjà dans votre queue donc c'est possible que la ligne que vous avez exécuté juste avant pour lancer votre tâche à synchrone la ligne juste après s'exécute après l'exécution de cette tâche parce que le worker était déjà disponible, appris tout de suite et dans ce cas vous êtes très très très chanceux mais c'est aussi possible que ça arrive une heure après donc vous avez pas du tout d'état donc déjà juste pour ça vous êtes d'un côté à synchrone de deux ça vous fait un autre flux donc s'il y a une erreur si il y a un autre boot ou autre qui se passe ça va en se faire sur un autre stream et ça va pas du tout arrêter votre Django ce qui est aussi un des gros intérêts de travailler avec des systèmes à synchrone même pour des toutes petites tâches par exemple dans mon cas quand je travaille de manière professionnelle tous mes envoies d'email je les fais sur des tâches à synchrone parce qu'un envoi d'email vous dépendez d'une surface tierce souvent j'appelle send green ou send in blue pour envoyer mes emails c'est possible qu'il y ait une panne de réseau c'est possible qu'il y ait une panne de service chez eux ça arrive couramment donc le fait de le faire dans un système à synchrone ça me permet d'éviter toute forme de latence de répondre tout de suite à mon utilisateur comme je le montrais tout à l'heure la division du PDF qu'on passe de 3 secondes à une seconde et demi et en plus de ça si j'ai une erreur je ne vais pas du tout faire planter mon sweat principal et mon diateur aura déjà reçu son succès et de l'autre côté je vais pouvoir le loguer prévenir à un customer support ou autre et pouvoir refaire la tâche parce qu'en plus elle va être loguée avec tous les inputs nécessaires donc très facile à relancer donc c'est pas du tout une tâche à compte ça reste une tâche à synchrone même si vous avez un seul worker excellent et puis est-ce que c'est vrai pour autant j'ai unicorn donc pour les requêtes HDDP et pour les tâches Celeric on va lancer de façon explicit tout à fait l'un comme l'autre c'est toujours le cas c'est d'ailleurs pour ça que j'ai unicorn utilise un système de worker de base pour les serveurs web c'est que si vous avez des personnes qui appellent et que vous avez une requête 500 parce que vous avez fait une erreur dans votre code on veut surtout pas planter tout le reste du site comme on avait le cas des fois à l'époque pour ceux qui faisaient du PHP on avait des fois ça avec les systèmes modernes tous les serveurs web maintenant sont à synchrone pour ça ça permet de faire des calls bien séparés chaque utilisateur a sa propre latence et c'est pour ça justement aussi que je vous disais qu'il faut surtout pas voir j unicorn comme une solution viable pour faire des exports qui prennent un certain temps parce que même s'ils prennent 10, 20 secondes ou 30 secondes et que vous n'avez pas besoin d'augmenter les timeouts vous prenez quand même de la payload en quelque sorte de vos utilisateurs donc vous ralentissez votre site pendant ce temps-là parce que vous prenez les workers qui sont censés être pour ces gens-là super donc je continue à éviter les gens à nous poser leurs questions sur Youtube ou sur Slack j'en ai une question pour toi Noël tu nous as parlé de configurer nos serveurs d'aller chercher peut-être des machines avec des plus grosses CPU plus de coeur est-ce que tu as des astuces à partager avec nous sur comment faire la prévision de la capacité qu'on va avoir besoin est-ce qu'il y a des outils qui vont me permettre de faire des stress tests qui seraient relativement réalistes comparés à qu'est-ce qu'on va avoir parce que c'est définitivement différent d'aussi on avait quelque chose de synchrone ou ça serait plus facile à voir à quel point on va charger notre serveur tout à fait c'est une très bonne question aussi alors pour les stress tests on les voit souvent à l'école puis quand je vois des gens qui sont assez jeunes souvent ils sont motivés par ça et ils veulent partir là-dedans il faut comprendre que ça coûte excessivement cher en stress tests souvent on parle de centaines voire de milliers de dollars selon ce que vous voulez faire donc ça peut être très très très coûteux et là on parle vraiment de pouvoir rouler un test de centaines de dollars par test c'est assez courant donc vous n'allez pas le mettre dans votre pipeline de continuous integration continuous deployment pour le faire rouler à chaque comique que vous faites vous allez finir pauvre très très très rapidement ce que je fais en général plus aussi bien dans mes projets personnels que professionnels c'est que j'essaye de travailler surtout avec les bons partenaires notamment moi je mets quasiment tout aujourd'hui sur Google Cloud Platform juste parce qu'en fait il me permette de voir mes puissances de CPU mes puissances de RAM mes lectures sur disque etc en temps réel à plus ou moins 5 minutes près mais je les vois vraiment à la minute une fois que c'est là il y en a plein d'autres qui le font vous êtes vraiment pas obligés d'aller chez google daemon vous êtes capable d'aller sur ceux qui sont en logiciel libre etc simplement si vous débuter ça peut vous permettre d'avoir beaucoup moins de choses à installer parce que si vous voulez être sur du free software il faut comprendre ces technologies là il faut monter votre serveur mais avec des fournisseurs comme google comme amazon aujourd'hui vous avez toutes les métriques nécessaires d'entrer de jeu quand vous vous connectez donc si vous débuter c'était un peu plus simple pour apprendre de là vous pouvez partir avec un serveur mettre ces métriques là, commencer à faire un usage normal puis voir un peu la puissance que vous consommez puis adapter au feu à mesure il faut aussi faire très attention parce que quand vous faites des serveurs à la demande souvent je vois les débutants qui se font avoir sur les facturations parce qu'ils se rendent pas compte, ils utilisent tout seul ils sont pas trop chers, puis d'un coup il y a 4, 5, 6, 7, 8, 10 serveurs qui partent alors soit ça coûte très très très cher soit ils tapent des thresholds qui ne connaissaient pas où ils ont mis mais sans trop les savoirs et du coup ils se retrouvent avec une application qui est très très très lente et ils comprennent pas pourquoi parce qu'ils ne savent pas où est-ce que ça frappe et où est-ce que ça bloque pour démarrer souvent moi je préfère commencer avec un serveur fixe plutôt que des serveurs à la demande sur lequel j'installe celleries etc parce que justement ça me permet de pouvoir voir ma puissance de cpu mon nombre d'agents etc ça me permet de faire des tests beaucoup plus facilement qu'on s'y connait pas puis ensuite une fois que j'ai une bonne idée de comment marche mon outil que je suis en train de développer là je commence à avoir des solutions plus professionnelles avec des utiles ordres Excellent, je rappelle à tout le monde ne vous gênez pas et n'hésitez pas à poser vos questions à Noël sur Slack ou sur Youtube Noël, un petit suivi sur cette question donc te parler de serveurs à la demande est-ce qu'on a des fonctionnalités dans celleries qui vont nous aider à lancer ces serveurs-là ou est-ce que c'est quelque chose qu'on doit partir de notre côté en suivant la demande de notre service puis en faisant les appels manuels à l'Opéie de Gourclal Tout à fait, alors là-dessus encore il y a pas mal de choses qui sont possibles, celleries comme je vous l'ai dit tout à l'heure c'est vraiment plus un système de messagerie en tant que tel, souvent on le confond et c'est vrai que moi même souvent quand j'en parle je vois plus ça comme un système de tâche à synchrone c'est un système de messagerie mais par-dessus RabbitMQ, il permet de faire une communication avec Python et le système de messagerie donc ça peut être RabbitMQ mais ça peut en être un autre tous ces systèmes MQTT l'idée c'est qu'une fois que vous avez votre code Python qui est capable de voir ces messages vous pourriez très bien contacter par exemple l'API de Google et instantier des serveurs à la demande chez Cloud Run par exemple, qui sont des serveurs qui peuvent rouler un certain nombre de minutes maximum si vous êtes chez Amazon, vous pourriez lancer des serveurs lambda etc donc vous êtes capable d'adapter vous êtes capable même d'appeler vos propres serveurs sur votre propre Cloud donc vous pouvez instaurer des machines ou vous pourriez même les allumer à la demande vous pourriez préparer des serveurs, les éteindre et les allumer en fonction de la demande si vous voyez que vous avez un petit peu trop de tâches entrantes et trop peu de tâches sortantes vous allumez un serveur de plus l'important c'est de savoir un petit peu la volatilité de vos demandes finalement si vous avez une demande assez constante un serveur fixe vous coûtera souvent beaucoup moins cher que des serveurs à la demande parce que c'est comme ça qu'ils font de l'argent avec le Cloud si vous avez une grosse volatilité et que des fois vous avez surtout rien qui tourne ça vaut beaucoup plus le coup souvent d'avoir des serveurs que à la demande parce que du coup vous allez payer que quand vous consommez puis même si vous poutez un peu plus cher par usage tous les moments où vous ne consommez rien du tout qu'on pense largement si vous avez une volatilité qui est comme à état donc vous avez par exemple 100 demandes constantes par seconde puis de temps en temps vous montez à 300 ça redescend à 100 dans la soirée vous avez 2 steps différents ça peut valoir le coup des fois d'avoir des serveurs qui vont scale up ou d'avoir un deuxième serveur qui s'allume pendant la journée c'est un peu le cas par exemple moi j'ai un Jenkins en interne puis on a un premier serveur qu'on utilise tout le temps puis quand j'ai des peaks en semaine je peux ouvrir mon deuxième serveur moi il n'est pas automatisé mais on pourrait le automatiser exactement avec ce système là qui permettrait de lancer pour faire plus de CICD en semaine puis moins la soirée excellent merci pour ces réponses Toëlle on continue à ne pas avoir de questions mais je soupçonne qu'il va avoir des gens qui vont voir cette vidéo-là en rediffusion avec l'enregistrement qui reste sur Youtube comment est-ce que ces gens peuvent te contacter s'ils ont des questions comme j'ai dit au tout début je vais mettre sur moi mes slides sur le Slack j'imagine comme ça ils pourront les retrouver dessus vous allez retrouver mon GitHub et mon LinkedIn et puis sinon sur le Slack de Montréal Python je suis tout le temps connecté donc vous pouvez me retrouver dans les privates messages ou sur un des channels où vous pouvez juste me pingler puis je viendrai vous répondre excellent et bien je précise qu'on va aussi copier ces liens dans la description du vidéo Youtube si ça te convient et ça va rendre ça facile aux gens qui vont voir cette vidéo-là en rediffusion très bonne idée excellent mais merci beaucoup Noël merci à toi merci Noël bien tiens que tu as regardé avec moi puis parce que c'est ça est-ce que tu penses que j'ai oublié quelque chose encore pour annoncer quelque chose je pense que tu as fait une très bonne présentation des événements futurs de Montréal Python comme Duke l'a mentionné on a un lien vers Meetup où on a toute la liste des événements futurs on va avoir des prochains événements mensuels avec des présentations techniques puis les soirées de programmation on va planifier quand ça va être le prochain esprit de traduction on vient juste d'en finir un puis on va recharger nos piles et on va annoncer ça probablement quand on va être plus proche de la publication de Python 3.11 donc probablement proche tout le mois d'octobre ok cool d'abord je vais profiter pour que ça lui aide tout le monde et on va se voir à 5 à 7 et Duke comment les gens trouvent l'URL de ce 5 à 7 oui c'est ça c'est sur notre YouTube channel il est là et là ok ça vient de papier ici est-ce que tu veux conclure en anglais ? excellent donc, as Duke mentionné on va avoir un peu d'événements dans le next few months donc plus de meetings with technical presentations, more programming nights where we pair program together and probably more translation sprints we haven't figured out quite yet when the next one is going to be but probably close to the release of Python 3.11 around October and now it's time to go in a more informal part of the evening, our virtual happy hour so go fetch your favorite evening drink or enter the evening drink if that's what you're into right now I am into that right now and we're going to see you at that URL ok see you Yannick thank you Tunvong