Argumen String Threading Python

156

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.

Anonim
sumber
49
Mengapa Anda memiliki titik koma di akhir setiap baris?
Maikflow
@ Maikflow Bukankah itu praktik yang baik? ASI mengubah garis tidak titik koma menjadi titik koma di latar belakang afaik.
IK

Jawaban:

296

Anda mencoba membuat tuple, tetapi Anda hanya mengekstrak string :)

Tambahkan ekstra ',':

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

Atau gunakan tanda kurung untuk membuat daftar:

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

Jika Anda perhatikan, dari jejak tumpukan: self.__target(*self.__args, **self.__kwargs)

The *self.__argsberubah string Anda ke dalam daftar karakter, melewati mereka ke processLine fungsi. Jika Anda memberikan daftar satu elemen, itu akan melewati elemen itu sebagai argumen pertama - dalam kasus Anda, string.

Stephen
sumber
1
tanda kurung tambahan pada akhir baris kedua dari blok kode kedua. Saya ingin mengeditnya tetapi kurang dari 6 karakter
harmonickey
Jika Anda memiliki arg2 dengan nilai default, lakukan ini. threading.Thread(target=thread_function, args=(arg1,),kwargs={'arg2': arg2})
DeveScie
8

Saya berharap dapat memberikan lebih banyak latar belakang pengetahuan di sini.

Pertama, tanda tangan konstruktor dari metode threading :: Thread :

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

args adalah tuple argumenuntuk permohonan target. Default ke ().

Kedua, kekhasan dalam Python tentang tuple:

Tuple kosong dibangun oleh sepasang kurung kosong; tupel dengan satu item dikonstruksi dengan mengikuti nilai dengan koma (tidak cukup untuk menyertakan nilai tunggal dalam tanda kurung).

Di sisi lain, string adalah urutan karakter, seperti 'abc'[1] == 'b'. Jadi jika mengirim string args, 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 TypeErroruntuk mengeluh.

tengah lapangan
sumber