Saya punya masalah dengan threading Python dan mengirim string dalam argumen.
def processLine(line) :
print "hello";
return;
.
dRecieved = connFile.readline();
processThread = threading.Thread(target=processLine, args=(dRecieved));
processThread.start();
Di mana dRecured adalah string satu baris yang dibaca oleh suatu koneksi. Ini memanggil fungsi sederhana yang sampai sekarang hanya memiliki satu pekerjaan pencetakan "halo".
Namun saya mendapatkan kesalahan berikut
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 adalah panjang dari string yang saya coba sampaikan, jadi saya kira itu memecahnya menjadi masing-masing karakter dan mencoba untuk melewati argumen seperti itu. Ini berfungsi dengan baik jika saya hanya memanggil fungsi secara normal tetapi saya benar-benar ingin mengaturnya sebagai utas terpisah.
python
multithreading
Anonim
sumber
sumber
Jawaban:
Anda mencoba membuat tuple, tetapi Anda hanya mengekstrak string :)
Tambahkan ekstra ',':
Atau gunakan tanda kurung untuk membuat daftar:
Jika Anda perhatikan, dari jejak tumpukan:
self.__target(*self.__args, **self.__kwargs)
The
*self.__args
berubah string Anda ke dalam daftar karakter, melewati mereka keprocessLine
fungsi. Jika Anda memberikan daftar satu elemen, itu akan melewati elemen itu sebagai argumen pertama - dalam kasus Anda, string.sumber
threading.Thread(target=thread_function, args=(arg1,),kwargs={'arg2': arg2})
Saya berharap dapat memberikan lebih banyak latar belakang pengetahuan di sini.
Pertama, tanda tangan konstruktor dari metode threading :: Thread :
Kedua, kekhasan dalam Python tentang
tuple
:Di sisi lain, string adalah urutan karakter, seperti
'abc'[1] == 'b'
. Jadi jika mengirim stringargs
, bahkan dalam tanda kurung (masih menyengat), setiap karakter akan diperlakukan sebagai parameter tunggal.Namun, Python sangat terintegrasi dan tidak seperti JavaScript di mana argumen tambahan dapat ditoleransi. Sebaliknya, itu melempar
TypeError
untuk mengeluh.sumber