J'ai un problème avec le threading Python et l'envoi d'une chaîne dans les arguments.
def processLine(line) :
print "hello";
return;
.
dRecieved = connFile.readline();
processThread = threading.Thread(target=processLine, args=(dRecieved));
processThread.start();
Où dRecieved est la chaîne d'une ligne lue par une connexion. Il appelle une fonction simple qui pour le moment n'a qu'un seul travail d'impression "bonjour".
Cependant, j'obtiens l'erreur suivante
Traceback (most recent call last):
File "C:\Python25\lib\threading.py", line 486, in __bootstrap_inner
self.run()
File "C:\Python25\lib\threading.py", line 446, in run
self.__target(*self.__args, **self.__kwargs)
TypeError: processLine() takes exactly 1 arguments (232 given)
232 est la longueur de la chaîne que j'essaie de passer, donc je suppose qu'il la divise en chaque caractère et essaie de passer les arguments comme ça. Cela fonctionne bien si j'appelle simplement la fonction normalement, mais j'aimerais vraiment la configurer en tant que thread séparé.
python
multithreading
Anonyme
la source
la source
Réponses:
Vous essayez de créer un tuple, mais vous mettez simplement une chaîne entre parenthèses :)
Ajoutez un extra ',':
Ou utilisez des crochets pour faire une liste:
Si vous remarquez, à partir de la trace de la pile:
self.__target(*self.__args, **self.__kwargs)
Le
*self.__args
transforme votre chaîne en une liste de caractères, en les transmettant à laprocessLine
fonction. Si vous lui passez une liste à un élément, il passera cet élément comme premier argument - dans votre cas, la chaîne.la source
threading.Thread(target=thread_function, args=(arg1,),kwargs={'arg2': arg2})
J'espère fournir plus de connaissances de base ici.
Tout d'abord, la signature du constructeur de la méthode threading :: Thread :
Deuxièmement, une bizarrerie en Python à propos de
tuple
:D'autre part, une chaîne est une séquence de caractères, comme
'abc'[1] == 'b'
. Donc, si vous envoyez une chaîne àargs
, même entre parenthèses (toujours une piqûre), chaque caractère sera traité comme un seul paramètre.Cependant, Python est tellement intégré et n'est pas comme JavaScript où des arguments supplémentaires peuvent être tolérés. Au lieu de cela, il jette une
TypeError
plainte.la source