Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2350 connectés 

 

Sujet(s) à lire :
    - Who's who@Programmation
 

 Mot :   Pseudo :  
  Aller à la page :
 
 Page :   1  2  3  4  5  ..  25184  25185  25186  ..  27186  27187  27188  27189  27190  27191
Auteur Sujet :

[blabla@olympe] Le topic du modo, dieu de la fibre et du monde

n°2436031
masklinn
í dag viðrar vel til loftárása
Posté le 19-12-2022 à 15:23:54  profilanswer
 

Reprise du message précédent :

hephaestos a écrit :


Oui, carrément. En revanche ça va pas radicalement changer la complexité, ça accélère la fin mais ça ne la simplifie pas : quand on peut en fabriquer un par tour on n'explore pas les autres cas.


Absolument [:romf]


---------------
I mean, true, a cancer will probably destroy its host organism. But what about the cells whose mutations allow them to think outside the box by throwing away the limits imposed by overbearing genetic regulations? Isn't that a good thing?
mood
Publicité
Posté le 19-12-2022 à 15:23:54  profilanswer
 

n°2436032
Jubijub
Parce que je le VD bien
Posté le 19-12-2022 à 15:45:41  profilanswer
 

Hermes le Messager a écrit :

Bon, j'ai fini par prendre un personal plan chez Udemy pour numéro 1. :( ça fait chier de payer, mais j'en avais trop marre de chercher sans cesse des tutorials de qualité. De plus, j'ai déjà payé un tutorial Unity pour elle sur cette plateforme.
 
Encore un abonnement. :/ Quand on regarde le prix des cours, il est rentabilisé au bout de 3 ou 4 cours. Mais ça me fait chier quand même, pas tant à cause du prix que du principe qui fait que tu rajoutes sans cesse des abonnements pour tout. :(


pour le coup c'est un bon investissement : tu regretteras moins ton abo Udemy quand elle ramènera une Medal Fields :o
 

invik a écrit :


L'argent pour les médecins déjà entrés dans le système.
Quand on voit la dernière grève des généralistes qui réclament une consultation à 50€, soit 100% d'augmentation pour le même acte, et pas forcément plus de moyens, d'aides... Ce n'est qu'une question d'argent et pas de qualité de la médecine.


pense au prix horaire de ton coiffeur, considère la criticité des actes en questions. Je pense qu'ils se touchent un peu, mais c'est pas forcément déconnant.

Anonymouse a écrit :


 
J'avais lu un rapport sur la pénurie de médecin en France de la part d'une agence de santé. Ce n'est pas uniquement dû à la pyramide des ages et au départ à la retraite des médecins non compensé auquel s'ajoute, en plus, un changement du mode d'exercice des médecins nouvellement formés qui sont moins "productifs" : temps partiels, moins d'heures, médecins qui n'exercent pas ou passent de praticiens à administratifs etc. La conclusion du rapport était que ça allait s'empirer et qu'il était impossible de prévoir quand la situation s’améliorerait [:satrincha:1].
 
Et dans les responsable du numerus clausus, en plus des gouvernements, il y a aussi les syndicat de médecins de l'époque.


enculés de jeunes qui veulent de la work/life balance, si ça se trouve ils veulent même être heureux ? Putain ça me dégoute :o
 

masklinn a écrit :


Puis même avec ça:
 

  • J’ai pas l’impression que l’attractivité de la vie de campagne ait beaucoup augmenté pour les toubibs, donc t’as très vite des déserts médicaux.
  • Toute la médecine a augmenté en complexité (avec le progrès médical), et sauf à avoir des maisons médicales c’est pas comme si le généraliste pouvait se spécialiser, donc la quantité de travail par patient augmente, et c’est pas un domaine attractif, si tu peux tu vas aller dans des spécialités intéressantes (et qui rapportent plus)… et si tu veux causer avec les gens tu vas partir psy. Il y a des gens pour qui généraliste c’est une vocation, mais faut pas se leurrer, le cachet social a fait une chute libre depuis 50 ans.
  • Ce qui est démultiplié par le fait qu’on suggère (à raison) de passer plus souvent chez le médecin, pas juste quand tu t’es mis un coup de hache dans le pied.
  • Et naturellement le numérus clausus débile combiné à une population vieillissante qui nous a mis dans un putain de trou.


En ligne avec le reste de la société, les généralistes sont pas dans les bas revenus mais les "revenus non pécuniers" sont non-existants et par comparaison au reste leurs revenus ne justifie généralement plus de vivre le job et d'être disponible 24/7.
 
Et le passage de praticien à admin c'est aussi une grosse augmentation de la quantité d'admin à faire, et du coût de payer quelqu'un.
 
À noter que les pénuries médicales c'est pas juste en france, donc il y a des problèmes spécifiques (genre le numerus clausus, compensé en piquant des médecins ou des places en médecine, les belges s'en plaignent depuis longtemps), mais il y a aussi des problèmes qui sont plus généraux.


 
Moi pour les coups de hache je fais une mixture bouse de vache / pissenlit / amanite tue-mouche, en cataplasme. Y'a tous les produits pas loin.

Spoiler :

si tu meurs pas dans les 24h t'as de bonne chances de guérison après :o


 
Mandatory https://www.youtube.com/watch?v=Ni0YfrSK570  
 
Perso je suis fan des cabinets médicaux : y'a toujours un docteur, j'ai des RDV dans la journée si besoin, dans tous les cas dans la semaine, c'est super. Comme ils sont un pool de 4 ils ont la thune pour une mini labo d'analyse, donc quand j'y vais 80% des résultats de ma prise de sang sont dispo sous 10min pendant que je parle avec ma doctoresse.
Je comprends malheureusement très bien le médecin qui veut pas bosser 80h / semaines parce que c'est le seul dans un rayon de 30km, à etre sur la route tous les jours et devoir éviter les gens bourrés sur leur tracteur (attention, un jugement de valeur sur la campagne a pu se glisser bien involontairement dans cette phrase. Je tiens pourtant à dire que le dernier accident de bagnole de ma mère c'était dans son camion (elle étant antiquaire), sur une route parfaitement droite et dégagée. Le fermier a démarré juste devant le camion. Réponse de l'intéressé (qui a miraculeusement survévu), avec l'accent bressan qui va bien  : Oh, bah yé cru qu'ç'étôt un tracteurrrrrr.)
 

rokhlan a écrit :


Il leur faut bien ça pour oublier que le pays a un taux de pauvreté à 36,5 % et une inflation à plus de 92 % sur l'année [:megoced]


mais non enfin, ils ont GAGNÉ LA COUPE DU MONDE ! ça va forcément mettre fin à la pauvreté, créer un système d'éducation égalitaire et performant, mettre fin à la corruption.
Y'a déjà des headlines de journaux dans ce sens.
Note que je suis content pour Messi, il l'avait pas dans sa collection celle là, et pis si ça fait plaisir à la population j'y vois aucun mal, mais je doute fortement que ça change quoi que ce soit. La prime FIFA va partir à la fédération qui va en filer la grosse partie aux joueurs en prime de matchs / buts, ils vont construire 2 terrains de street soccer pour que les gamins jouent pied nus sur de l'asphalte au lieu de la terre battue, pis ça va s'arreter là.
 


---------------
Jubi Photos : Flickr - 500px
n°2436033
masklinn
í dag viðrar vel til loftárása
Posté le 19-12-2022 à 15:49:34  profilanswer
 

Après tout un tas d'amélioration, j'ai passé mon day19 part 2 de 5.5 secondes à 6.2 secondes [:lechewal]


---------------
I mean, true, a cancer will probably destroy its host organism. But what about the cells whose mutations allow them to think outside the box by throwing away the limits imposed by overbearing genetic regulations? Isn't that a good thing?
n°2436034
R3g
fonctionnaire certifié ITIL
Posté le 19-12-2022 à 16:01:40  profilanswer
 

masklinn a écrit :

Après tout un tas d'amélioration, j'ai passé mon day19 part 2 de 5.5 secondes à 6.2 secondes [:lechewal]


Le mieux que je fais c'est 70 s :/
 
edit : c'est tombé à 1,5 s en remplaçant le BFS par un DFS [:le kneu]

Message cité 1 fois
Message édité par R3g le 19-12-2022 à 16:12:50

---------------
Au royaume des sourds, les borgnes sont sourds.
n°2436036
masklinn
í dag viðrar vel til loftárása
Posté le 19-12-2022 à 16:18:33  profilanswer
 

R3g a écrit :


Le mieux que je fais c'est 70 s :/
 
edit : c'est tombé à 1,5 s en remplaçant le BFS par un DFS [:le kneu]


Ouais le DFS est une super mauvaise idée ici [:dawa]
 
Sur le thread de solutions /u/boojum a une super optimisation, une version beaucoup plus smart de celle que j'avais proposé, mais ça impose une valeur globale :/

Spoiler :

Avant de sélectionner le robot à construire, tu peux calculer (en temps constant) combien de géode tu aurais si tu ne construisais plus que des geode-bots: geodes + geobots * t + (t (t+2)) / 2.
 
Tu gardes une globale du meilleur maximum que t'as trouvé (mise à jour quand t'arrives en fin d'une branche de ton DFS), et si ta récolte potentielle est plus basse que le maximum existant, tu peux terminer la branche immédiatement, elle sert à rien.
 
Before:
Part 1: 1427 (in 102.48625ms)
Part 2: 4400 (in 5.841482416s)
 
After:
Part 1: 1427 (in 45.529958ms)
Part 2: 4400 (in 58.975666ms)
 
[:petrus75]

Message cité 1 fois
Message édité par masklinn le 19-12-2022 à 16:19:13

---------------
I mean, true, a cancer will probably destroy its host organism. But what about the cells whose mutations allow them to think outside the box by throwing away the limits imposed by overbearing genetic regulations? Isn't that a good thing?
n°2436037
R3g
fonctionnaire certifié ITIL
Posté le 19-12-2022 à 16:23:36  profilanswer
 

masklinn a écrit :


Ouais le DFS est une super mauvaise idée ici [:dawa]
 
Sur le thread de solutions /u/boojum a une super optimisation, une version beaucoup plus smart de celle que j'avais proposé, mais ça impose une valeur globale :/

Spoiler :

Avant de sélectionner le robot à construire, tu peux calculer (en temps constant) combien de géode tu aurais si tu ne construisais plus que des geode-bots: geodes + geobots * t + (t (t+2)) / 2.
 
Tu gardes une globale du meilleur maximum que t'as trouvé (mise à jour quand t'arrives en fin d'une branche de ton DFS), et si ta récolte potentielle est plus basse que le maximum existant, tu peux terminer la branche immédiatement, elle sert à rien.
 
Before:
Part 1: 1427 (in 102.48625ms)
Part 2: 4400 (in 5.841482416s)
 
After:
Part 1: 1427 (in 45.529958ms)
Part 2: 4400 (in 58.975666ms)
 
[:petrus75]



Ah mais je le fais déjà ça :o

Spoiler :


avec une boucle parce que j'avais pas trouvé la formule :
max_reach, r = a_ge, r_ge
for i in range(tl + 1):
    max_reach += r + i
if max_reach < max_ge:
    continue


 
edit : du coup je poste mon code, il reste surement d'autres optimisations à trouver : https://topaz.github.io/paste/#XQAA [...] 44oUP92abh

Message cité 2 fois
Message édité par R3g le 19-12-2022 à 16:25:53

---------------
Au royaume des sourds, les borgnes sont sourds.
n°2436038
el muchach​o
Comfortably Numb
Posté le 19-12-2022 à 16:35:37  profilanswer
 

Dites, c'est normal que le fichier de base de données de SQLite enregistre tout en SQL dans un fichier texte ? Je suis super surpris.


---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
n°2436039
nraynaud
lol
Posté le 19-12-2022 à 16:38:34  profilanswer
 

non, t'as soit un dump, soit un fichier de log du driver, ou un truc du style.


---------------
trainoo.com, c'est fini
n°2436040
hephaestos
Sanctis Recorda, Sanctis deus.
Posté le 19-12-2022 à 16:38:47  profilanswer
 

R3g a écrit :


Ah mais je le fais déjà ça :o

Spoiler :


avec une boucle parce que j'avais pas trouvé la formule :
max_reach, r = a_ge, r_ge
for i in range(tl + 1):
max_reach += r + i
if max_reach < max_ge:
continue

 

edit : du coup je poste mon code, il reste surement d'autres optimisations à trouver : https://topaz.github.io/paste/#XQAA [...] 44oUP92abh


Somme des termes d'une suite arithmétique : première.

n°2436041
R3g
fonctionnaire certifié ITIL
Posté le 19-12-2022 à 16:42:13  profilanswer
 

hephaestos a écrit :


Somme des termes d'une suite arithmétique : première.


Ça fait 30 ans, donc :o


---------------
Au royaume des sourds, les borgnes sont sourds.
mood
Publicité
Posté le 19-12-2022 à 16:42:13  profilanswer
 

n°2436042
masklinn
í dag viðrar vel til loftárása
Posté le 19-12-2022 à 16:44:34  profilanswer
 

R3g a écrit :


Ah mais je le fais déjà ça :o

Spoiler :


avec une boucle parce que j'avais pas trouvé la formule :
max_reach, r = a_ge, r_ge
for i in range(tl + 1):
    max_reach += r + i
if max_reach < max_ge:
    continue


 
edit : du coup je poste mon code, il reste surement d'autres optimisations à trouver : https://topaz.github.io/paste/#XQAA [...] 44oUP92abh


C'est qu'une option de lisibilité mais un truc auquel j'ai songé (mais que j'ai pas encore fait) c'est de stocker les robots, resources, et couts de robots dans un array BE (geode, obsidian, clay, ore), comme ça tu peux juste faire une comparaison lexicale pour savoir si t'as atteint tes seuils (de resources pour construire un bot, de production pour les bots, ...). en fait j'ai plus de comparaisons de ce style dans mon code, et essayer d'appliquer le changement rend juste le code plus lent.
 
edit: pourquoi tu maj max_ge à chaque tour et pas juste quand t=0?
edit 2: je suis pas sûr que "seen" soit super utile, j'ai fait sans perso

el muchacho a écrit :

Dites, c'est normal que le fichier de base de données de SQLite enregistre tout en SQL dans un fichier texte ? Je suis super surpris.


T'aurais pas activé le query logging?
 
Sinon apparemment selon le SQLITE_TEMP_STORE et pragma temp_store, tu peux apparemment avoir un truc appelé "statements journal" qui est écrit, mais je sais pas ce que ça contient.

Message cité 2 fois
Message édité par masklinn le 19-12-2022 à 17:07:03

---------------
I mean, true, a cancer will probably destroy its host organism. But what about the cells whose mutations allow them to think outside the box by throwing away the limits imposed by overbearing genetic regulations? Isn't that a good thing?
n°2436043
invik
J'ai pas ma manette :o
Posté le 19-12-2022 à 16:52:31  profilanswer
 

Jubijub a écrit :


pense au prix horaire de ton coiffeur, considère la criticité des actes en questions. Je pense qu'ils se touchent un peu, mais c'est pas forcément déconnant.

 

J'ai pas dit que c'était déconnant. Même si probablement un peu. Dans un contexte d'inflation, il faudrait qu'eux aussi soient revalorisés.
Mais 100% d'augment', aux frais de l'assurance maladie, donc de nos impôts, sans contrepartie et pendant que les salaires et cotisations n'augmentent pas en même temps que l'inflation, c'est hors-sol pour une population qui appartient tout de même aux 5% des ménages les plus aisés.
L'accès aux soins pour les plus pauvres serait encore plus dramatique.


Message édité par invik le 19-12-2022 à 16:53:33
n°2436044
R3g
fonctionnaire certifié ITIL
Posté le 19-12-2022 à 16:55:21  profilanswer
 

masklinn a écrit :


C'est qu'une option de lisibilité mais un truc auquel j'ai songé (mais que j'ai pas encore fait) c'est de stocker les robots, resources, et couts de robots dans un array BE (geode, obsidian, clay, ore), comme ça tu peux juste faire une comparaison lexicale pour savoir si t'as atteint tes seuils (de resources pour construire un bot, de production pour les bots, ...).
 
edit: pourquoi tu maj max_ge à chaque tour et pas juste quand t=0?
edit 2: je suis pas sûr que "seen" soit super utile, j'ai fait sans perso


seen était ma première tentative d'optimisation, il est resté depuis, mais en effet je peux le supprimer sans effet visible.
pour max_ge pareil, en faisant du BFS je me disais que ça pouvait avoir un sens, mais plus avec le DFS


---------------
Au royaume des sourds, les borgnes sont sourds.
n°2436045
el muchach​o
Comfortably Numb
Posté le 19-12-2022 à 17:01:32  profilanswer
 

masklinn a écrit :


T'aurais pas activé le query logging?
 
Sinon apparemment selon le SQLITE_TEMP_STORE et pragma temp_store, tu peux apparemment avoir un truc appelé "statements journal" qui est écrit, mais je sais pas ce que ça contient.


Les seules options que j'ai passées à sqlite3_open_v2() sont
 
SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_WAL


---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
n°2436046
masklinn
í dag viðrar vel til loftárása
Posté le 19-12-2022 à 17:14:53  profilanswer
 

R3g a écrit :


seen était ma première tentative d'optimisation, il est resté depuis, mais en effet je peux le supprimer sans effet visible.
pour max_ge pareil, en faisant du BFS je me disais que ça pouvait avoir un sens, mais plus avec le DFS


En fait tu fais ton DFS 1x par unité de temps et tu regardes où en sont tes resources non?
 
Tu pourrais ptet gagner un peu en faisant l'inverse: tu choisis quel est le prochain bot à construire (modulo nécessité que tu peux précalculer facilement), et une fois que t'as fait ça tu peux brûler des étapes parce que si t'as besoin de 7 obsidian et que t'en fabriques 1/mn, tu peux juste avancer de 7mn et monter tes resources de 7xbot (après avoir décrémenté du coût du bot que tu veux constuire). Ça devrait faire moins d'états et de traffic.
 
Mais calculer le skip forward est un peu chiant (c'est ce que je trouve moche chez moi mais je vois pas trop comment le sexifier)
 
Bon par contre comme ton code est pas uniforme ça va être chiant à implémenter.


Message édité par masklinn le 19-12-2022 à 17:18:15

---------------
I mean, true, a cancer will probably destroy its host organism. But what about the cells whose mutations allow them to think outside the box by throwing away the limits imposed by overbearing genetic regulations? Isn't that a good thing?
n°2436047
nucl3arfl0
Better Call Saul
Posté le 19-12-2022 à 17:32:54  profilanswer
 

Putain ils ont pété la fibre par chez moi.
Réparation prévu pour cette matinée, puis décalée au 22 fin de journée.
La 4G est saturée, j'avais pas prévu d'aller sur site les jours suivants [:corten:1]

 

En fait le mobile est perturbé aussi sauf la 3G.. La grosse misère

Message cité 1 fois
Message édité par nucl3arfl0 le 19-12-2022 à 17:38:01
n°2436048
el muchach​o
Comfortably Numb
Posté le 19-12-2022 à 17:39:08  profilanswer
 

el muchacho a écrit :

Dites, c'est normal que le fichier de base de données de SQLite enregistre tout en SQL dans un fichier texte ? Je suis super surpris.


nraynaud a écrit :

non, t'as soit un dump, soit un fichier de log du driver, ou un truc du style.


Putain, en fait c'est le viewer intégré à Midnight Commander qui décode automatiquement les fichiers SQLite [:wam]


Message édité par el muchacho le 19-12-2022 à 17:39:30

---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
n°2436049
Flaie
Posté le 19-12-2022 à 17:51:56  profilanswer
 

Bon ben welcome la grippe, en arrêt pour la semaine, plus de cogip avant le 03/01 c'est tjrs ça

n°2436050
nucl3arfl0
Better Call Saul
Posté le 19-12-2022 à 17:58:51  profilanswer
 

nucl3arfl0 a écrit :

Putain ils ont pété la fibre par chez moi.
Réparation prévu pour cette matinée, puis décalée au 22 fin de journée.
La 4G est saturée, j'avais pas prévu d'aller sur site les jours suivants [:corten:1]

 

En fait le mobile est perturbé aussi sauf la 3G.. La grosse misère


Comment on fait quand le réseau mobile est aussi impacté ?
https://suivi-des-incidents.orange.fr/service24

 

Ben dans'l'cul lulu

n°2436052
masklinn
í dag viðrar vel til loftárása
Posté le 19-12-2022 à 18:11:34  profilanswer
 

nucl3arfl0 a écrit :


Comment on fait quand le réseau mobile est aussi impacté ?
https://suivi-des-incidents.orange.fr/service24
 
Ben dans'l'cul lulu


Oui s’tu veux jamais être impacté faut plus de backups: ADSL, cable, et satellite.  
 
Mais pour un particulier c’est un poil overkill.


---------------
I mean, true, a cancer will probably destroy its host organism. But what about the cells whose mutations allow them to think outside the box by throwing away the limits imposed by overbearing genetic regulations? Isn't that a good thing?
n°2436053
ratibus
Posté le 19-12-2022 à 18:45:22  profilanswer
 

gfive a écrit :

Après...
 
Si dans le trou il y a un bloc, hein?? Ça marche plus!


Si, ça fonctionne :bounce:

Spoiler :

Faut exclure les blocs coincés à l'intérieur du calcul de la surface extérieure :  
Heureusement il y avait le cas dans le jeu de données de test car c'est sur lui que je viens de passer au moins 1h à essayer de comprendre mon pb :D
J'ai dû sortir Excel pour visualiser le souci du bloc situé en 2,2,2 et que mon DFS ne trouvait pas pendant le flood fill.
https://i.imgur.com/bTPrhFV.png
Du coup ça donne ça, qui tourne plutôt vite, pour le jour 18 : https://github.com/ratibus/adventof [...] /solve.php
Je détecte les bulles d'air avec un DFS, pour lesquelles j'applique le calcul de la partie 1 pour trouver leur surface externe (en ayant pris le soin de virer les cubes éventuellement coincés dans les bulles).

n°2436054
el muchach​o
Comfortably Numb
Posté le 19-12-2022 à 19:01:07  profilanswer
 

Flaie a écrit :

Bon ben welcome la grippe, en arrêt pour la semaine, plus de cogip avant le 03/01 c'est tjrs ça


Bon courage et bon rétablissement. Moi ces temps-ci, c'est masque en public. C'est d'ailleurs ce que les pouvoirs publics recommandent, les hôpitaux étant en passe de saturer de nouveau.


---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
n°2436055
Devil'sTig​er
Posté le 19-12-2022 à 19:56:47  profilanswer
 

masklinn a écrit :

Après tout un tas d'amélioration, j'ai passé mon day19 part 2 de 5.5 secondes à 6.2 secondes [:lechewal]


 
FAUT PARALLELISER [:di_canio]
 
ET UNE FOIS QUE CA MARCHE PAS FAUT RABBITMQ [:di_canio]
 
ET APRES FAUT TOUT REFAIRE EN RUST [:toyoyost:2]

n°2436056
masklinn
í dag viðrar vel til loftárása
Posté le 19-12-2022 à 20:08:35  profilanswer
 

Devil'sTiger a écrit :

FAUT PARALLELISER [:di_canio]


J'ai essayé de paralléliser, mais après le pruning ça fait que ralentir. REMBOURSEZ!

Devil'sTiger a écrit :

ET UNE FOIS QUE CA MARCHE PAS FAUT RABBITMQ [:di_canio]


Wow wow wow, calmons nous :o

Devil'sTiger a écrit :

ET APRES FAUT TOUT REFAIRE EN RUST [:toyoyost:2]


C'EST DÉJÀ EN RUST< REMBOURSEZ111


---------------
I mean, true, a cancer will probably destroy its host organism. But what about the cells whose mutations allow them to think outside the box by throwing away the limits imposed by overbearing genetic regulations? Isn't that a good thing?
n°2436057
nraynaud
lol
Posté le 19-12-2022 à 20:09:53  profilanswer
 

https://superfastpython.com/threadp [...] ach_Thread
dites, vous avez pas l'impression dans cet exemple qu'il donne le même threadlocal à tous les threads du pool ?
 
Je trouve pas d'autre exemple sur le net, je cherche à mettre un request.Session() et une connexion de DB dans chaque thread de mon pool.
 
edit:  
https://i.imgur.com/3xqT613.png
 
[:pingouino]

Message cité 2 fois
Message édité par nraynaud le 19-12-2022 à 20:35:43

---------------
trainoo.com, c'est fini
n°2436058
masklinn
í dag viðrar vel til loftárása
Posté le 19-12-2022 à 20:36:54  profilanswer
 

nraynaud a écrit :

https://superfastpython.com/threadp [...] ach_Thread
dites, vous avez pas l'impression dans cet exemple qu'il donne le même threadlocal à tous les threads du pool ?


C’est normal, threading.local créée un proxy et gère la localité en interne.


---------------
I mean, true, a cancer will probably destroy its host organism. But what about the cells whose mutations allow them to think outside the box by throwing away the limits imposed by overbearing genetic regulations? Isn't that a good thing?
n°2436060
gfive
Posté le 19-12-2022 à 20:52:31  profilanswer
 

Bon sinon visuellement avatar 2 c'est une tuerie.

 

Vu en 3d, ça apporte vraiment qqchose contrairement à d'autres films que j'ai vu.


---------------
Tous les sud africains sont ségrégationistes, à part Ted. (P. Desproges)
n°2436061
masklinn
í dag viðrar vel til loftárása
Posté le 19-12-2022 à 21:19:57  profilanswer
 


Tu peux faire "pydoc _threading_local" dans ton terminal:

Help on module _threading_local:
 
NAME
    _threading_local - Thread-local objects.
 
MODULE REFERENCE
    https://docs.python.org/3.11/library/_threading_local.html
     
    The following documentation is automatically generated from the Python
    source files.  It may be incomplete, incorrect or include features that
    are considered implementation detail and may vary between Python
    implementations.  When in doubt, consult the module reference at the
    location listed above.
 
DESCRIPTION
    (Note that this module provides a Python version of the threading.local
     class.  Depending on the version of Python you're using, there may be a
     faster one available.  You should always import the `local` class from
     `threading`.)
     
    Thread-local objects support the management of thread-local data.
    If you have data that you want to be local to a thread, simply create
    a thread-local object and use its attributes:
     
      >>> mydata = local()
      >>> mydata.number = 42
      >>> mydata.number
      42
     
    You can also access the local-object's dictionary:
     
      >>> mydata.__dict__
      {'number': 42}
      >>> mydata.__dict__.setdefault('widgets', [])
      []
      >>> mydata.widgets
      []
     
    What's important about thread-local objects is that their data are
    local to a thread. If we access the data in a different thread:
     
      >>> log = []
      >>> def f():
      ...     items = sorted(mydata.__dict__.items())
      ...     log.append(items)
      ...     mydata.number = 11
      ...     log.append(mydata.number)
     
      >>> import threading
      >>> thread = threading.Thread(target=f)
      >>> thread.start()
      >>> thread.join()
      >>> log
      [[], 11]
     
    we get different data.  Furthermore, changes made in the other thread
    don't affect data seen in this thread:
     
      >>> mydata.number
      42
     
    Of course, values you get from a local object, including a __dict__
    attribute, are for whatever thread was current at the time the
    attribute was read.  For that reason, you generally don't want to save
    these values across threads, as they apply only to the thread they
    came from.
     
    You can create custom local objects by subclassing the local class:
     
      >>> class MyLocal(local):
      ...     number = 2
      ...     def __init__(self, /, **kw):
      ...         self.__dict__.update(kw)
      ...     def squared(self):
      ...         return self.number ** 2
     
    This can be useful to support default values, methods and
    initialization.  Note that if you define an __init__ method, it will be
    called each time the local object is used in a separate thread.  This
    is necessary to initialize each thread's dictionary.
     
    Now if we create a local object:
     
      >>> mydata = MyLocal(color='red')
     
    Now we have a default number:
     
      >>> mydata.number
      2
     
    an initial color:
     
      >>> mydata.color
      'red'
      >>> del mydata.color
     
    And a method that operates on the data:
     
      >>> mydata.squared()
      4
     
    As before, we can access the data in a separate thread:
     
      >>> log = []
      >>> thread = threading.Thread(target=f)
      >>> thread.start()
      >>> thread.join()
      >>> log
      [[('color', 'red')], 11]
     
    without affecting this thread's data:
     
      >>> mydata.number
      2
      >>> mydata.color
      Traceback (most recent call last):
      ...
      AttributeError: 'MyLocal' object has no attribute 'color'
     
    Note that subclasses can define slots, but they are not thread
    local. They are shared across threads:
     
      >>> class MyLocal(local):
      ...     __slots__ = 'number'
     
      >>> mydata = MyLocal()
      >>> mydata.number = 42
      >>> mydata.color = 'red'
     
    So, the separate thread:
     
      >>> thread = threading.Thread(target=f)
      >>> thread.start()
      >>> thread.join()
     
    affects what we see:
     
      >>> mydata.number
      11
     
    >>> del mydata
 
CLASSES
    builtins.object
        local
     
    class local(builtins.object)
     |  local(*args, **kw)
     |  
     |  Methods defined here:
     |  
     |  __delattr__(self, name)
     |      Implement delattr(self, name).
     |  
     |  __getattribute__(self, name)
     |      Return getattr(self, name).
     |  
     |  __setattr__(self, name, value)
     |      Implement setattr(self, name, value).
     |  
     |  ----------------------------------------------------------------------
     |  Static methods defined here:
     |  
     |  __new__(cls, /, *args, **kw)
     |      Create and return a new object.  See help(type) for accurate signature.
     |  
     |  ----------------------------------------------------------------------
     |  Data descriptors defined here:
     |  
     |  __dict__
     |      dictionary for instance variables (if defined)
 
DATA
    __all__ = ['local']
 
FILE
    /Users/masklinn/.pyenv/versions/3.11.0/lib/python3.11/_threading_local.py
 


---------------
I mean, true, a cancer will probably destroy its host organism. But what about the cells whose mutations allow them to think outside the box by throwing away the limits imposed by overbearing genetic regulations? Isn't that a good thing?
n°2436062
nraynaud
lol
Posté le 19-12-2022 à 21:50:05  profilanswer
 

masklinn a écrit :


Tu peux faire "pydoc _threading_local" dans ton terminal:

Help on module _threading_local:
 
NAME
    _threading_local - Thread-local objects.
(...)



merci.
 
je crois que j'ai été me paumer dans les ronces là:
Je veux appeller la même fonction (hold_lol), une fois dans une boucle et une fois dans un threadpool:
 

Code :
  1. class LOL
  2.  
  3.    def hold_lol(self, lol: PurchasableLol, db_connection: Connection = self.db_connection,
  4.                    session: Session = requests.Session()) -> dict:
  5.        # ....
  6.  
  7.    def hold_lols_list(self) -> List[dict]:
  8.        with requests.Session() as s:
  9.            with sqlalchemy.engine.create_engine(DATABASE_URL).connect() as db_connection:
  10.                held_lols = []
  11.                for lol in self.purchase_lol_list:
  12.                    held_lol = self.hold_lol(lol, db_connection, s)
  13.                    if held_lol:
  14.                        held_lols.append(held_lol)
  15.                    sleep(self.sleep_between_each_hold)
  16.                return held_lols
  17.  
  18.    @staticmethod
  19.    def init_thread(local, resources):
  20.        res = {'db': sqlalchemy.engine.create_engine(DATABASE_URL).connect(), 'session': requests.Session()}
  21.        local.resources = res
  22.        resources.append(res)
  23.  
  24.    def hold_lol_thread(self, params):
  25.        (lol, local) = params
  26.        return self.hold_lol(lol, local.resources.db, local.resources.session)
  27.  
  28.    def hold_lols_list_ASYNC(self) -> List[dict]:
  29.        local = threading.local()
  30.        resources = []
  31.        try:
  32.            with concurrent.futures.ThreadPoolExecutor(initializer=self.init_thread,
  33.                                                       initargs=(local, resources)) as executor:
  34.                held_lols = executor.map(self.hold_lol_thread,
  35.                                            zip(self.purchase_lols_list, local * len(self.purchase_lols_list)))
  36.                held_lols = list(held_lols)
  37.                held_lols = [item for item in held_lols if item]  # filtering the None values
  38.                return held_lols
  39.        finally:
  40.            for r in resources:
  41.                r.db.close()
  42.                r.session.close()


 
la création et le nettoyage des resources par thread sent un poil le jardinage, j'ai raté un truc plus simple je pense.
 
edit: j'utilise le requests.Session() pour avoir du keepalive sur le serveur distant, parce qu'il y a du https et tout, ça rame.
 
edit2: je vois qu'un truc sur stack overflow https://stackoverflow.com/questions [...] r-shutdown  
et j'arrive pas à utiliser la recherche de github pour trouver un bon exemple.

Message cité 1 fois
Message édité par nraynaud le 19-12-2022 à 22:11:17

---------------
trainoo.com, c'est fini
n°2436063
masklinn
í dag viðrar vel til loftárása
Posté le 19-12-2022 à 22:12:15  profilanswer
 

nraynaud a écrit :


merci.

 

je crois que j'ai été me paumer dans les ronces là:
Je veux appeller la même fonction (hold_lol), une fois dans une boucle et une fois dans un threadpool:

 
Code :
  1. class LOL
  2.  
  3.    def hold_lol(self, lol: PurchasableLol, db_connection: Connection = self.db_connection,
  4.                    session: Session = requests.Session()) -> dict:
  5.        # ....
  6.  
  7.    def hold_lols_list(self) -> List[dict]:
  8.        with requests.Session() as s:
  9.            with sqlalchemy.engine.create_engine(DATABASE_URL).connect() as db_connection:
  10.                held_lols = []
  11.                for lol in self.purchase_lol_list:
  12.                    held_lol = self.hold_lol(lol, db_connection, s)
  13.                    if held_lol:
  14.                        held_lols.append(held_lol)
  15.                    sleep(self.sleep_between_each_hold)
  16.                return held_lols
  17.  
  18.    @staticmethod
  19.    def init_thread(local, resources):
  20.        res = {'db': sqlalchemy.engine.create_engine(DATABASE_URL).connect(), 'session': requests.Session()}
  21.        local.resources = res
  22.        resources.append(res)
  23.  
  24.    def hold_lol_thread(self, params):
  25.        (lol, local) = params
  26.        return self.hold_lol(lol, local.resources.db, local.resources.session)
  27.  
  28.    def hold_lols_list_ASYNC(self) -> List[dict]:
  29.        local = threading.local()
  30.        resources = []
  31.        try:
  32.            with concurrent.futures.ThreadPoolExecutor(initializer=self.init_thread,
  33.                                                       initargs=(local, resources)) as executor:
  34.                held_lols = executor.map(self.hold_lol_thread,
  35.                                            zip(self.purchase_lols_list, local * len(self.purchase_lols_list)))
  36.                held_lols = list(held_lols)
  37.                held_lols = [item for item in held_lols if item]  # filtering the None values
  38.                return held_lols
  39.        finally:
  40.            for r in resources:
  41.                r.db.close()
  42.                r.session.close()
 

la création et le nettoyage des resources par thread sent un poil le jardinage, j'ai raté un truc plus simple je pense.


Je suis pas sûr, le cleanup de threadlocals c'est toujours la merde.

 

Regarde toujours contextvars, c'est des threadlocals un peu plus velues qui marchent avec les coroutines. Quand je les ai testées ça marchait bien mais l'API est assez bizarre.

 

Pour SQLA tu devrais regarder les sessions, elles sont thread-safe, comme ça tu te fais pas chier. Malheureusement c'est pas le cas des sessions de requests. mais ça c'est moins grave de pas les fermer je pense.

 

Une autre considération potentielle (si tu veux vraiment faire ça bien et fermer tes requests.Session) c'est d'utiliser ExitStack au lieu de te faire chier à faire ton cleanup à la main:

Code :
  1. class Lol:
  2.    def hold_lols_list_ASYNC(self) -> List[dict]:
  3.        local = threading.local()
  4.        with ExitStack() s:
  5.            with concurrent.futures.ThreadPoolExecutor(initializer=self.init_thread,
  6.                                                       initargs=(local, s)) as executor:
  7.                held_lols = executor.map(self.hold_lol_thread,
  8.                                            zip(self.purchase_lols_list, local * len(self.purchase_lols_list)))
  9.                held_lols = list(held_lols)
  10.                held_lols = [item for item in held_lols if item]  # filtering the None values
  11.                return held_lols
  12.  
  13.    @staticmethod
  14.    def init_thread(local, resources):
  15.        local.db = resources.enter_context(sqlalchemy.engine.create_engine(DATABASE_URL).connect())
  16.        local.req = resources.enter_context(requests.Session())


truc du style (pas fan des staticmethods non plus mais YMMV)

 

Le 3e c'est du micro mais

Code :
  1. held_lols = list(held_lols)
  2.                held_lols = [item for item in held_lols if item]  # filtering the None values
  3.                return held_lols


peut probablement être simplifié en

Code :
  1. return list(filter(None, held_lols))

Message cité 3 fois
Message édité par masklinn le 19-12-2022 à 22:15:35

---------------
I mean, true, a cancer will probably destroy its host organism. But what about the cells whose mutations allow them to think outside the box by throwing away the limits imposed by overbearing genetic regulations? Isn't that a good thing?
n°2436064
masklinn
í dag viðrar vel til loftárása
Posté le 19-12-2022 à 22:20:05  profilanswer
 

Accessoirement

Code :
  1. def hold_lol_thread(self, params):
  2.        (lol, local) = params
  3.        return self.hold_lol(lol, local.resources.db, local.resources.session)


Code :
  1. held_lols = executor.map(self.hold_lol_thread,
  2.                                            zip(self.purchase_lols_list, local * len(self.purchase_lols_list)))


D'après la doc, comme le builtin `Executor.map` peut prendre plusieurs itérables (ça fait zipmap), donc tu peux simplifier en  

Code :
  1. def hold_lol_thread(self, lol, local):
  2.        return self.hold_lol(lol, local.resources.db, local.resources.session)


Code :
  1. held_lols = executor.map(self.hold_lol_thread,
  2.                                           self.purchase_lols_list, local * len(self.purchase_lols_list))


Et tu peux utiliser `itertools.repeat(local)` au lieu de bricoler avec des listes, comme un zip classique ça s'arrête à l'itérable le plus court donc normalement c'est utilisable avec des itérateurs infinis.


---------------
I mean, true, a cancer will probably destroy its host organism. But what about the cells whose mutations allow them to think outside the box by throwing away the limits imposed by overbearing genetic regulations? Isn't that a good thing?
n°2436065
nraynaud
lol
Posté le 19-12-2022 à 22:23:56  profilanswer
 

masklinn a écrit :


Je suis pas sûr, le cleanup de threadlocals c'est toujours la merde.
 
Regarde toujours contextvars, c'est des threadlocals un peu plus velues qui marchent avec les coroutines. Quand je les ai testées ça marchait bien mais l'API est assez bizarre.
 
Pour SQLA tu devrais regarder les sessions, elles sont thread-safe, comme ça tu te fais pas chier. Malheureusement c'est pas le cas des sessions de requests. mais ça c'est moins grave de pas les fermer je pense.
 
Une autre considération potentielle (si tu veux vraiment faire ça bien et fermer tes requests.Session) c'est d'utiliser ExitStack au lieu de te faire chier à faire ton cleanup à la main:

Code :
  1. class Lol:
  2.    def hold_lols_list_ASYNC(self) -> List[dict]:
  3.        local = threading.local()
  4.        with ExitStack() s:
  5.            with concurrent.futures.ThreadPoolExecutor(initializer=self.init_thread,
  6.                                                       initargs=(local, s)) as executor:
  7.                held_lols = executor.map(self.hold_lol_thread,
  8.                                            zip(self.purchase_lols_list, local * len(self.purchase_lols_list)))
  9.                held_lols = list(held_lols)
  10.                held_lols = [item for item in held_lols if item]  # filtering the None values
  11.                return held_lols
  12.  
  13.    @staticmethod
  14.    def init_thread(local, resources):
  15.        local.db = resources.enter_context(sqlalchemy.engine.create_engine(DATABASE_URL).connect())
  16.        local.req = resources.enter_context(requests.Session())


truc du style (pas fan des staticmethods non plus mais YMMV)
 
Le 3e c'est du micro mais

Code :
  1. held_lols = list(held_lols)
  2.                held_lols = [item for item in held_lols if item]  # filtering the None values
  3.                return held_lols


peut probablement être simplifié en

Code :
  1. return list(filter(None, held_lols))



Merci, je regarde tout ça.  
Je pense que l'Exitstatck est un bon deus ex machina, c'est carrément aller se brancher sur un système de defer à la go.
 
en tout cas merci, t'as au moins ouvert le jeu, je suis sous l'eau mentalement, et je peux pas trop tester le code, parce qu'on est dans des conditions qu'on va appeler "un petit poil antagonique".
 
Je corrige le filtrage, j'ai aussi corrigé l'orthographe en postant, mais on revient de loin niveau code style, il reste plus trop de route, mon collègue gaze bien et il voit l'intérêt de tout ça, je vais peut-être avoir une barre de warnings utilisable bientôt.


---------------
trainoo.com, c'est fini
n°2436066
nraynaud
lol
Posté le 19-12-2022 à 22:25:14  profilanswer
 

masklinn a écrit :

Accessoirement

Code :
  1. def hold_lol_thread(self, params):
  2.        (lol, local) = params
  3.        return self.hold_lol(lol, local.resources.db, local.resources.session)


Code :
  1. held_lols = executor.map(self.hold_lol_thread,
  2.                                            zip(self.purchase_lols_list, local * len(self.purchase_lols_list)))


D'après la doc, comme le builtin `Executor.map` peut prendre plusieurs itérables (ça fait zipmap), donc tu peux simplifier en  

Code :
  1. def hold_lol_thread(self, lol, local):
  2.        return self.hold_lol(lol, local.resources.db, local.resources.session)


Code :
  1. held_lols = executor.map(self.hold_lol_thread,
  2.                                           self.purchase_lols_list, local * len(self.purchase_lols_list))


Et tu peux utiliser `itertools.repeat(local)` au lieu de bricoler avec des listes, comme un zip classique ça s'arrête à l'itérable le plus court donc normalement c'est utilisable avec des itérateurs infinis.


merci pour tout, je vais le faire.


---------------
trainoo.com, c'est fini
n°2436068
nraynaud
lol
Posté le 19-12-2022 à 23:17:33  profilanswer
 

masklinn a écrit :


Pour SQLA tu devrais regarder les sessions, elles sont thread-safe, comme ça tu te fais pas chier. Malheureusement c'est pas le cas des sessions de requests. mais ça c'est moins grave de pas les fermer je pense.


https://docs.sqlalchemy.org/en/14/o [...] hread-safe
J'ai pas l'impression que ce soit le cas ?

 

edit: y'a l'air d'y avoir ça https://docs.sqlalchemy.org/en/14/o [...] contextual , je vais devoir lire lentement, et avec le doigt.

Message cité 1 fois
Message édité par nraynaud le 19-12-2022 à 23:18:45

---------------
trainoo.com, c'est fini
n°2436069
masklinn
í dag viðrar vel til loftárása
Posté le 19-12-2022 à 23:25:53  profilanswer
 


Whop désolé pour le mensonge, heureusement que t’as vérifié


Message édité par masklinn le 19-12-2022 à 23:26:05

---------------
I mean, true, a cancer will probably destroy its host organism. But what about the cells whose mutations allow them to think outside the box by throwing away the limits imposed by overbearing genetic regulations? Isn't that a good thing?
n°2436070
Devil'sTig​er
Posté le 19-12-2022 à 23:39:14  profilanswer
 

masklinn a écrit :


C'EST DÉJÀ EN RUST< REMBOURSEZ111


 
RAJOUTE DE L4ASM, UNE COUCHE DE TOKIO, JE SAIS PAS FAIT QUELQUE CHOSE POURQUOI TU METS LA CHARGE MENTALE SUR MOAAAA  :fou:
 
/ FOU / FOU /
 
 [:wark0]  
 

Spoiler :


Bon sinon j'ai lu l'énnoncé et je n'ai rien compris, ca parle d'éléphant, de robot, ca a l'air d'être de la bonne ce qu'il prend en tout cas [:manulelutin:5]

n°2436071
nucl3arfl0
Better Call Saul
Posté le 19-12-2022 à 23:39:22  profilanswer
 

J'aimerai tellement utiliser SQLA à la place de Django  [:garypresident]

n°2436072
masklinn
í dag viðrar vel til loftárása
Posté le 19-12-2022 à 23:59:12  profilanswer
 

Devil'sTiger a écrit :


 
RAJOUTE DE L4ASM, UNE COUCHE DE TOKIO, JE SAIS PAS FAIT QUELQUE CHOSE POURQUOI TU METS LA CHARGE MENTALE SUR MOAAAA  :fou:
 
/ FOU / FOU /
 
 [:wark0]  
 

Spoiler :


Bon sinon j'ai lu l'énnoncé et je n'ai rien compris, ca parle d'éléphant, de robot, ca a l'air d'être de la bonne ce qu'il prend en tout cas [:manulelutin:5]



En même temps si tu commences jour 19 c’est chaud vu qu’AOC à toute une histoire de jour en jour.

nucl3arfl0 a écrit :

J'aimerai tellement utiliser SQLA à la place de Django  [:garypresident]


Chuis pas persuadé que du sql alchemy de merde soit mieux que du django de merde notes.

Message cité 1 fois
Message édité par masklinn le 20-12-2022 à 00:00:16

---------------
I mean, true, a cancer will probably destroy its host organism. But what about the cells whose mutations allow them to think outside the box by throwing away the limits imposed by overbearing genetic regulations? Isn't that a good thing?
n°2436073
Anonymouse
Posté le 20-12-2022 à 00:14:35  profilanswer
 

Jubijub a écrit :


enculés de jeunes qui veulent de la work/life balance, si ça se trouve ils veulent même être heureux ? Putain ça me dégoute :o


C'est vrai que t'en a rien à foutre. Avec ton niveau de vie tu pourras toujours aller dans la médecine privée pendant que les gueux crèveront :o

n°2436074
nucl3arfl0
Better Call Saul
Posté le 20-12-2022 à 07:22:09  profilanswer
 

masklinn a écrit :


Chuis pas persuadé que du sql alchemy de merde soit mieux que du django de merde notes.


Ce serait quoi l'alternative ?
Parce que django Jpp  [:omar cheifrai:2]

n°2436075
SekYo
Posté le 20-12-2022 à 07:28:37  profilanswer
 

nucl3arfl0 a écrit :

J'aimerai tellement utiliser SQLA à la place de Django  [:garypresident]


C'est quoi ton besoin ? Autant SQLA est très puissant, autant c'est aussi assez complexe de rentrer dedans et on s'est pris plusieurs fois les pieds dans le tapis.
Et ayant commencé par Django, j'avais très envie de jouer avec SQLA.

 

Mais aujourd'hui, à moins d'avoir un vrai besoin de construire des requêtes complètement dynamiques, je ne suis pas sur de choisir SQLA (si bien sur j'ai le choix du framework web associé, c'est sur qu'en Flask l'ORM de Django sera moins une solution :D). Alors oui le query builder de Django est plus limité, mais du coup bin tu bascules direct au raw SQL... Et globalement ça fait aussi le taf, tu "perds" pas du temps à vouloir traduire une query SQL en code Python/SQLA.
Alors peut-être que notre approche n'était pas la bonne, mais ça nous est arrivé de nombreuses fois en SQLA d'avoir des (mauvaises) surprises quand on voulait traduire des requêtes SQL, pas forcément très complexes, en SQLA... Et ce qu'il nous donnait réellement en SQL sorti. Pas mal de problèmes notamment liés aux différences entre les .join / joinedload / eagerload. Après tout est écrit dans la doc au final, mais l'apprentissage est plus complexe qu'un Django avec ses "select_related" & basta (du moins le souvenir que j'en ai, ça fait quand même quelques années).

 

Edit: Y avait aussi la déclaration des modèles en SQLA, avec le double style impératif et déclaratif, qui était plus confusant qu'autre chose, mais ils ont pas mal fait le ménage et clarifié la doc depuis.


Message édité par SekYo le 20-12-2022 à 07:30:45
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2  3  4  5  ..  25184  25185  25186  ..  27186  27187  27188  27189  27190  27191

Aller à :
Ajouter une réponse
 

Sujets relatifs
Plus de sujets relatifs à : [blabla@olympe] Le topic du modo, dieu de la fibre et du monde


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)