Eu tenho um problema com o Python threading e o envio de uma string nos argumentos.
def processLine(line) :
print "hello";
return;
.
dRecieved = connFile.readline();
processThread = threading.Thread(target=processLine, args=(dRecieved));
processThread.start();
Onde dRecieved é a sequência de uma linha lida por uma conexão. Ele chama uma função simples que, a partir de agora, tem apenas um trabalho de impressão "olá".
No entanto, recebo o seguinte erro
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 é o comprimento da string que estou tentando passar, então acho que está dividindo em cada caractere e tentando passar os argumentos assim. Funciona bem se eu apenas chamar a função normalmente, mas realmente gostaria de configurá-la como um thread separado.
python
multithreading
Anônimo
fonte
fonte
Respostas:
Você está tentando criar uma tupla, mas está apenas parênteses uma string :)
Adicione um ',' extra:
Ou use colchetes para fazer uma lista:
Se você observar, no rastreamento de pilha:
self.__target(*self.__args, **self.__kwargs)
O
*self.__args
transforma seu string em uma lista de caracteres, passando-os para aprocessLine
função. Se você passar uma lista de um elemento, ele passará esse elemento como o primeiro argumento - no seu caso, a string.fonte
threading.Thread(target=thread_function, args=(arg1,),kwargs={'arg2': arg2})
Espero fornecer mais conhecimento de base aqui.
Primeiro, assinatura do construtor do método threading :: Thread :
Segundo, uma peculiaridade em Python sobre
tuple
:Por outro lado, uma string é uma sequência de caracteres, como
'abc'[1] == 'b'
. Portanto, se enviar uma string paraargs
, mesmo entre parênteses (ainda uma picada), cada caractere será tratado como um único parâmetro.No entanto, o Python é tão integrado e não é como o JavaScript, onde argumentos extras podem ser tolerados. Em vez disso, lança um
TypeError
para reclamar.fonte