Argumenty ciągów wątkowości w Pythonie


156

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.


49
Dlaczego na końcu każdego wiersza masz średniki?
Maikflow

@Maikflow Czy to nie dobra praktyka? ASI konwertuje linie nieposiadające średników na znaki w tle ze średnikami.
IK

Odpowiedzi:


296

Próbujesz utworzyć krotkę, ale umieszczasz ciąg znaków w nawiasach :)

Dodaj dodatkowy „,”:

dRecieved = connFile.readline()
processThread = threading.Thread(target=processLine, args=(dRecieved,))  # <- note extra ','
processThread.start()

Lub użyj nawiasów, aby utworzyć listę:

dRecieved = connFile.readline()
processThread = threading.Thread(target=processLine, args=[dRecieved])  # <- 1 element list
processThread.start()

Jeśli zauważysz, ze śladu stosu: self.__target(*self.__args, **self.__kwargs)

*self.__argsZamienia ciąg w listę znaków, przekazując je do processLine funkcji. Jeśli przekażesz mu listę jednego elementu, przekaże ten element jako pierwszy argument - w twoim przypadku jako łańcuch.


1
dodatkowe nawiasy na końcu drugiej linii drugiego bloku kodu. Chciałem go edytować, ale jest to mniej niż 6 znaków
harmonickey

Jeśli masz arg2 z wartością domyślną, zrób to. threading.Thread(target=thread_function, args=(arg1,),kwargs={'arg2': arg2})
DeveScie

8

Mam nadzieję, że przedstawię tutaj więcej podstawowej wiedzy.

Najpierw sygnatura konstruktora metody Threading :: Thread :

class threading.Thread(group=None, target=None, name=None, args=(), kwargs={}, *, daemon=None)

args jest krotką argumentówdla wywołania docelowego. Domyślnie ().

Po drugie, dziwactwo w Pythonie o tuple:

Puste krotki są konstruowane za pomocą pustej pary nawiasów; krotka z jednym elementem jest konstruowana poprzez następowanie po wartości przecinkiem (nie wystarczy umieścić pojedynczej wartości w nawiasach).

Z drugiej strony ciąg to sekwencja znaków, na przykład 'abc'[1] == 'b'. Więc jeśli wyślesz łańcuch do args, 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ę TypeErrordo narzekania.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.