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.
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é
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
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