Python, incohérence de malade en multithread je comprend pas

Salut-les-khey2
2021-08-07 15:06:34

J'essaie de comprendre les fondements du multithreading en ce moment et là, je me retrouve avec un fonctionnement qui devrait marcher, mais qui ne marche pas.

J'ai testé de lancer plusieurs threads avec chaqu'un un argument disposer dans une liste en l'occurrence une liste allant de 1 à 50https://image.noelshack.com/fichiers/2021/31/6/1628341165-liste.jpg

Cette liste, je la place en argument de la fonction nddTest dans la méthode map de la fonction executor alias de la fonction threadpoolexecutor() du module concurents.futures

Grosso modo, cela consiste à lancer un thread pour chaque élément de la liste 'listThread" ou chaque thread ira taper la fonction nddTest avec l'élément de la liste qui lui est associé.

Du coup ça marche bien quand je print l'argument de la variable numThread dans la fonction ndd test on voit bien le numéro de chaque thread :https://image.noelshack.com/fichiers/2021/31/6/1628341260-capture.jpg

Mais quand justement j'essaie d'utilisé cette argument cela ne marche pas, j'ai essayé de l'utiliser en attribut de la méthode listNdd.pop pour retirer des éléments de ma liste et ça ne marche pas !

Du coup y a surment un truc que je n'ai pas bité, mais je ne sais pas quoi car les arguments de la fonction nddTest son bien incrémenter comme il devrait.

Enterrement2021
2021-08-07 15:07:08

https://discord.gg/jvc

Salut-les-khey2
2021-08-07 15:08:50

la configuration de la liste ndd est mise en commentaire sur la photo mais bien évidement c'était pour l'exemple avec les nombre

GilbertVendee
2021-08-07 15:09:11

Fait un vrai langage comme Java.

Salut-les-khey2
2021-08-07 15:10:50

Le code :

import concurrent.futures
import requests


def nddTest(Numthread):
# listNdd.remove(Numthread)
print (Numthread)




# fichierListNdd = open(r"C:\Users\valbe\Desktop\software\Ndd Bulk Test\Ressource\Liste ndd.txt", "r")
# listNdd = [fichierListNdd.readline().replace('\n','') for ndd in fichierListNdd]


listThread = [numThread + 1 for numThread in range(50)]
with concurrent.futures.ThreadPoolExecutor() as executor:
results = executor.map(nddTest, listThread)



Salut-les-khey2
2021-08-07 15:16:04

Ah oui et j'ai bien utilisé la méthode pop et pas remove

AzaPlop
2021-08-07 15:16:27

Si c'est comme pour le module multiprocessing, quand tu lances un process parallèle ça crée une copie de toutes les variables d'environnement et c'est sur ces variables que le process travaille. Donc ici ton thread travaille sûrement sur un copie distincte de listNdd, différente de celle que tu déclares au début. Il faut déclarer des variables spéciales si tu veux faire de la mémoire partagée entre process.

Salut-les-khey2
2021-08-07 15:26:50

Le 07 août 2021 à 15:16:27 :
Si c'est comme pour le module multiprocessing, quand tu lances un process parallèle ça crée une copie de toutes les variables d'environnement et c'est sur ces variables que le process travaille. Donc ici ton thread travaille sûrement sur un copie distincte de listNdd, différente de celle que tu déclares au début. Il faut déclarer des variables spéciales si tu veux faire de la mémoire partagée entre process.

Ouais je vois mais ducoup la copie de liste se ferai avant toute instruction sur celle ci donc ça devrais pas posé de problème justement, j'ai planché sur ce point pendant un moment

AzaPlop
2021-08-07 15:30:29

Je comprends pas ce que tu veux dire par "la copie de liste se ferai toute instruction celle ci" kheyou.https://image.noelshack.com/fichiers/2016/50/1481994659-mathematicienrisitas.png

Tu parles des variables spéciales que j'évoquais dans mon message ou de ton cas avec ThreadPool ?

Salut-les-khey2
2021-08-07 15:30:40

Ok bon en fait ça marche plus ou moin maintenant voici la liste complète :https://image.noelshack.com/fichiers/2021/31/6/1628342997-liste.jpg

Et la liste après execution :https://image.noelshack.com/fichiers/2021/31/6/1628343038-capture.jpg

Salut-les-khey2
2021-08-07 15:32:28

Mais c'est vraiment anarchique la surpression devrais ce faire de 1 à 50 or c'est complètement aléatoire

AzaPlop
2021-08-07 15:33:35

Le 07 août 2021 à 15:32:28 :
Mais c'est vraiment anarchique la surpression devrais ce faire de 1 à 50 or c'est complètement aléatoire

Y'a pile 50 sites webs dans ta listeNdd ?

Azerban
2021-08-07 15:33:47

Mais tu veux faire quoi exactement, tu veux envoyer des requêtes à tous ces sites de manière simultanée ?

Envoie ta liste de sites web.

Salut-les-khey2
2021-08-07 15:33:58

Le 07 août 2021 à 15:30:29 :
Je comprends pas ce que tu veux dire par "la copie de liste se ferai toute instruction celle ci" kheyou.https://image.noelshack.com/fichiers/2016/50/1481994659-mathematicienrisitas.png

Tu parles des variables spéciales que j'évoquais dans mon message ou de ton cas avec ThreadPool ?

Oui j'ai bugger " la Copie de la liste ou (l'initialisation des thread) ce fait avant exécution de la fonction

Salut-les-khey2
2021-08-07 15:34:48

Le 07 août 2021 à 15:33:35 :

Le 07 août 2021 à 15:32:28 :
Mais c'est vraiment anarchique la surpression devrais ce faire de 1 à 50 or c'est complètement aléatoire

Y'a pile 50 sites webs dans ta listeNdd ?

Non beaucoup plus mais j'en ai 4500 la mais ç'est pour y voir plus clair

KaiserLeopold
2021-08-07 15:35:22

Le multithread en Python, j'ai jamais compris et ça n'a jamais marché :rire:

Salut-les-khey2
2021-08-07 15:41:35

Le 07 août 2021 à 15:33:47 :
Mais tu veux faire quoi exactement, tu veux envoyer des requêtes à tous ces sites de manière simultanée ?

Envoie ta liste de sites web.

Oui je souhaite tester si le ndd est actif et associé à un serveur ou non, en fait en appliquant la technique de la vidéo que tu m'a partager, j'ai réussi à produire quelque chose qui fonctionne bien, par contre ça nécessite d'ouvire autant de thread que de ndd

Voici le code :

import concurrent.futures
import requests


def nddTest(Ndd):
try:
nddResponse = requests.get(f'http://www.{Ndd}')
if nddResponse:
print(Ndd+' valide')
except:
requests.ConnectionError
nddOut = open(r"C:\Users\valbe\Desktop\software\Ndd Bulk Test\nddExpi.txt","a")
nddOut.write(f'{Ndd}\n')
nddOut.close
print(Ndd+' répond pas')

fichierListNdd = open(r"C:\Users\valbe\Desktop\software\Ndd Bulk Test\Ressource\Liste ndd.txt", "r")
listNdd = [fichierListNdd.readline().replace('\n','') for ndd in fichierListNdd]

with concurrent.futures.ThreadPoolExecutor() as executor:
results = executor.map(nddTest, listNdd)

Ducoup je sais pas si créer une tel quantité de thread est vraiment intéressant et je sais pas si à partir d'un certain nombre ça ne peut pas êtres contre productif :question:

Car la j'ai réussi à tester 2500 nom de domaine mais ça c'est mis à stagner, donc je sais pas si c'est du à la quantité de thread ou au fait que les serveur soit lent à charger, surement les deux.

Ducoup l'idéal ce serai quand même de lancer 50 voire 100 thread je pense.

Salut-les-khey2
2021-08-07 15:46:20

Le 07 août 2021 à 15:30:40 :
Ok bon en fait ça marche plus ou moin maintenant voici la liste complète :https://image.noelshack.com/fichiers/2021/31/6/1628343971-capture.jpg

Et la liste après execution :https://image.noelshack.com/fichiers/2021/31/6/1628343038-capture.jpg

Je m'étais suis tromper sur la première photo

Azerban
2021-08-07 15:52:53

Je veux bien tester ta liste mais je ne vais pas tout réécrire.

Salut-les-khey2
2021-08-07 15:56:18

Le 07 août 2021 à 15:52:53 :
Je veux bien tester ta liste mais je ne vais pas tout réécrire.

Ba tu as une idée pour faire sa proprement ?

Si non tkt tester la liste c'est une chose mais c'est apprendre et comprendre python derrière qui m'interesse

Infos
Gestion du forum

contact@geevey.com

API disponible. Utilisez le paramètre "api" en GET, peu importe le contenu, sur une page du site.

Notes

    Partenaire: JVFlux
    Ce site n'est pas associé à Jeuxvideo.com ou Webedia. Nous utilisons seulement des archives publiques.
    Il est inutile de me spammer par e-mail pour supprimer un topic. Au contraire, en conséquence, je mettrais votre topic dans le bloc ci-dessous.
Non-assumage
    Personne n'a pas assumé de topic pour le moment.