Tengo un problema con el subproceso de Python y el envío de una cadena en los argumentos.
def processLine(line) :
print "hello";
return;
.
dRecieved = connFile.readline();
processThread = threading.Thread(target=processLine, args=(dRecieved));
processThread.start();
Donde dRecieved es la cadena de una línea leída por una conexión. Llama a una función simple que en este momento solo tiene un trabajo de impresión "hola".
Sin embargo me sale el siguiente error
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 es la longitud de la cadena que estoy tratando de pasar, así que supongo que se divide en cada carácter e intenta pasar los argumentos de esa manera. Funciona bien si solo llamo a la función normalmente, pero realmente me gustaría configurarla como un hilo separado.
python
multithreading
Anónimo
fuente
fuente
Respuestas:
Estás tratando de crear una tupla, pero solo estás entre paréntesis de una cadena :)
Agregue un ',' extra:
O use corchetes para hacer una lista:
Si observa, desde el seguimiento de la pila:
self.__target(*self.__args, **self.__kwargs)
El
*self.__args
da vuelta a su cadena en una lista de caracteres, pasarlos a laprocessLine
función. Si le pasa una lista de un elemento, pasará ese elemento como primer argumento, en su caso, la cadena.fuente
threading.Thread(target=thread_function, args=(arg1,),kwargs={'arg2': arg2})
Espero proporcionar más conocimientos básicos aquí.
Primero, la firma del constructor del método de subprocesamiento :: Subproceso :
Segundo, un capricho en Python sobre
tuple
:Por otro lado, una cadena es una secuencia de caracteres, como
'abc'[1] == 'b'
. Entonces, si envía una cadena aargs
, incluso entre paréntesis (todavía una picadura), cada carácter será tratado como un solo parámetro.Sin embargo, Python está tan integrado y no es como JavaScript, donde se pueden tolerar argumentos adicionales. En cambio, arroja un
TypeError
quejarse.fuente