У меня проблема с потоками Python и отправкой строки в аргументах.
def processLine(line) :
print "hello";
return;
,
dRecieved = connFile.readline();
processThread = threading.Thread(target=processLine, args=(dRecieved));
processThread.start();
Где dRecoted - строка из одной строки, прочитанная соединением. Он вызывает простую функцию, которая на данный момент имеет только одно задание на печать "привет".
Однако я получаю следующую ошибку
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 - это длина строки, которую я пытаюсь передать, поэтому я предполагаю, что она разбивает ее на каждый символ и пытается передать подобные аргументы. Это работает нормально, если я просто вызываю функцию в обычном режиме, но я бы очень хотел настроить ее как отдельный поток.
python
multithreading
анонимное
источник
источник
Ответы:
Вы пытаетесь создать кортеж, но просто заключаете строку в скобки :)
Добавьте дополнительный ',':
Или используйте скобки, чтобы составить список:
Если вы заметили, из трассировки стека:
self.__target(*self.__args, **self.__kwargs)
*self.__args
Превращает строку в список символов, передавая их вprocessLine
функции. Если вы передадите ему список из одного элемента, он передаст этот элемент в качестве первого аргумента - в вашем случае - строку.источник
threading.Thread(target=thread_function, args=(arg1,),kwargs={'arg2': arg2})
Я надеюсь предоставить здесь дополнительные знания.
Во-первых, сигнатура конструктора метода threading :: Thread :
Во-вторых, причуды в Python о
tuple
:С другой стороны, строка представляет собой последовательность символов, например
'abc'[1] == 'b'
. Таким образом, если отправить строкуargs
даже в круглых скобках (все еще в строке ), каждый символ будет рассматриваться как один параметр.Однако Python настолько интегрирован и не похож на JavaScript, где допускаются дополнительные аргументы. Вместо этого он бросает
TypeError
жаловаться.источник