Mam problem z wątkami w Pythonie i wysyłaniem ciągu w argumentach.
def processLine(line) :
print "hello";
return;
.
dRecieved = connFile.readline();
processThread = threading.Thread(target=processLine, args=(dRecieved));
processThread.start();
Gdzie dRecieved to ciąg jednego wiersza odczytywanego przez połączenie. Wywołuje prostą funkcję, która w tej chwili ma tylko jedno zadanie drukowania „cześć”.
Jednak pojawia się następujący błąd
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 to długość ciągu, który próbuję przekazać, więc myślę, że dzieli go na każdy znak i próbuje przekazać argumenty w ten sposób. Działa dobrze, jeśli po prostu wywołam tę funkcję normalnie, ale naprawdę chciałbym ustawić ją jako oddzielny wątek.
python
multithreading
Anonimowy
źródło
źródło
Odpowiedzi:
Próbujesz utworzyć krotkę, ale umieszczasz ciąg znaków w nawiasach :)
Dodaj dodatkowy „,”:
Lub użyj nawiasów, aby utworzyć listę:
Jeśli zauważysz, ze śladu stosu:
self.__target(*self.__args, **self.__kwargs)
*self.__args
Zamienia ciąg w listę znaków, przekazując je doprocessLine
funkcji. Jeśli przekażesz mu listę jednego elementu, przekaże ten element jako pierwszy argument - w twoim przypadku jako łańcuch.źródło
threading.Thread(target=thread_function, args=(arg1,),kwargs={'arg2': arg2})
Mam nadzieję, że przedstawię tutaj więcej podstawowej wiedzy.
Najpierw sygnatura konstruktora metody Threading :: Thread :
Po drugie, dziwactwo w Pythonie o
tuple
:Z drugiej strony ciąg to sekwencja znaków, na przykład
'abc'[1] == 'b'
. Więc jeśli wyślesz łańcuch doargs
, nawet w nawiasach (nadal żądło), każdy znak będzie traktowany jako pojedynczy parametr.Jednak Python jest tak zintegrowany i nie jest podobny do JavaScript, w którym można tolerować dodatkowe argumenty. Zamiast tego rzuca się
TypeError
do narzekania.źródło