2017-09-25 3 views
-1

Alors ces derniers jours, j'ai essayé de comprendre comment commencer à avoir du fil et j'ai finalement réussi à le faire fonctionner! Le problème que je suis maintenant est que je veux qu'ils courent simultanément. J'entends différentes choses telles que GIL ne fonctionnera pas. Certains disent que cela fonctionne avec multiprocessing etc etc .. Cependant, je me suis retourné ici pour voir si c'est possible et quel est le dire de le faire?Python - Transformez le thread en multitraitement

Fondamentalement, mon code semble en ce moment comme celui-ci:

Le code avec filetage

def start(config): 
    NameUrl = config["Url"] 
    myNote = config["My-Note"] 
    checkoutNames(Nameurl, MyNote) 

if __name__ == '__main__': 
    with open('config.json', 'r', encoding='UTF-8') as json_data: 
     config = json.load(json_data) 
    threads = [] 
    for i, e in enumerate(config): 
     threads.append(threading.Thread(target=start, args=(config[i] or e))) 

Comme vous pouvez le voir dans if __name__ == '__main__': C'est où le fil est à ce moment. Cependant ce que cela fait en ce moment est qu'il fait d'abord le fil 1, quand c'est fait il tourne au fil 2 et continue comme ça et mon souhait est de le tourner simultanément/simultanément si c'est même possible?

EDIT

CODE

if __name__ == '__main__': 
    with open('config.json', 'r', encoding='UTF-8') as json_data: 
     config = json.load(json_data) 
    jobs = [] 
    for i, e in enumerate(config): 
     c = (config[i] or e) 
     p = multiprocessing.Process(target=start, args=(c)) 
     jobs.append(p) 
     p.start() 

L'erreur iam obtenir le code ci-dessus:

[<Process(Process-1, initial)>] 
<Process(Process-1, initial)> 
{'Email': '[email protected]', 'PersonNumber': '4234', 'ZipCode': '1241234', 'Name': 'Guess', 'LastName': 'TheyKnow'} 
[<Process(Process-1, started)>, <Process(Process-2, initial)>] 
<Process(Process-2, initial)> 
{'Email': '[email protected]', 'PersonNumber': '1234', 'ZipCode': '56431', 'Name': 'Stack', 'LastName': 'Overflow'} 
Process Process-1: 
Traceback (most recent call last): 
    File "C:\Users\AppData\Local\Programs\Python\Python36\lib\multiprocessing\process.py", line 249, in _bootstrap 
    self.run() 
    File "C:\Users\AppData\Local\Programs\Python\Python36\lib\multiprocessing\process.py", line 93, in run 
    self._target(*self._args, **self._kwargs) 
TypeError: start() takes 1 positional argument but 16 were given 
Process Process-2: 
Traceback (most recent call last): 
    File "C:\Users\AppData\Local\Programs\Python\Python36\lib\multiprocessing\process.py", line 249, in _bootstrap 
    self.run() 
    File "C:\Users\AppData\Local\Programs\Python\Python36\lib\multiprocessing\process.py", line 93, in run 
    self._target(*self._args, **self._kwargs) 
TypeError: start() takes 1 positional argument but 16 were given 
+0

Oui, multitraitement fonctionnera simultanément aussi longtemps que votre CPU a les cœurs pour y faire face. Essayez d'utiliser 'import multiprocessing' et' multiprocessing.Process' et voyez si vous pouvez le faire fonctionner. – quamrana

+0

Si votre travail se résume à utiliser 'requests' (ou équivalent) pour récupérer des données, vous ne devriez pas avoir de problèmes avec le GIL. Le GIL n'affecte que le code gourmand en CPU qui effectue les calculs réels. Quel est le problème concret que vous résolvez? – user4815162342

+0

@quamrana Le seul problème avec iam maintenant est d'activer '' 'threads.append (threading.Thread (target = start, args = (config [i] ou e))))' '' dans le multitraitement. Avez-vous une idée? Est-ce que cela change juste le threading. Thread dans '' '' multiprocessing.Process'''? – WeInThis

Répondre

2

Je pense que vous devez corriger le paramètre args:

... 
jobs = [] 
for i, e in enumerate(config): 
    c = (config[i] or e) 
    p = multiprocessing.Process(target=start, args=(c,)) 
    jobs.append(p) 
    p.start() 

Notez la syntaxe utilisée dans le paramètre args:

args=(c,)) # <=== (c,) means that we are assigning the tuple (c,) to args 
      # which gets translated into start(c) 
+0

Eh bien, il a donné le même résultat. Cependant le '' 'args = (c,))' '' la virgule me donne une erreur disant qu'elle ne peut pas trouver '' 'NameError: name 'i' n'est pas défini''' mais quand je supprime la virgule après * C * ça me donne une autre erreur en disant '' 'self._target (* self._args, ** self._kwargs) TypeError: start() prend 1 argument positionnel mais 16 ont été donnés''' Mais le programme continue fonctionne de toute façon en arrière-plan, même si l'erreur ... Et aussi il fonctionne à nouveau 1 et 1. – WeInThis

+0

Ce n'est pas possible. Vous devez avoir un autre code en cours d'exécution quelque part. – quamrana

+0

Je ai ajouté l'erreur dans le fil maintenant. Depuis trop longtemps pour le poster ici – WeInThis