Rumah > pembangunan bahagian belakang > Tutorial Python > Mengapa Perlaksanaan Benang Saya Anomali Apabila Saya Tidak Menggunakan Benang dalam Python secara Eksplisit?

Mengapa Perlaksanaan Benang Saya Anomali Apabila Saya Tidak Menggunakan Benang dalam Python secara Eksplisit?

Linda Hamilton
Lepaskan: 2024-11-09 15:48:02
asal
323 orang telah melayarinya

Why Does My Thread Execution Anomalous When I Don't Explicitly Invoke Threads in Python?

Anomali Pelaksanaan Benang: Menyahmistikan Seruan Benang Pramatang

Apabila mencipta benang dalam Python, adalah penting untuk memanggilnya dengan mula(secara eksplisit ) kaedah. Walau bagaimanapun, dalam situasi di mana fungsi sasaran digunakan dalam sintaks penciptaan benang, isu yang menarik timbul.

Masalahnya: Menjalankan Benang Tanpa Seruan Eksplisit

Pertimbangkan coretan kod berikut:

t1 = threading.Thread(target=self.read())
print("something")
t2 = threading.Thread(target=self.runChecks(), args=(self,))
Salin selepas log masuk

Anehnya, kenyataan cetakan tidak pernah dilaksanakan kerana self.read berjalan selama-lamanya, menghalang program daripada mencapai baris seterusnya. Tingkah laku ini kelihatan berlawanan dengan intuisi, kerana memanggil t1.start() harus memulakan pelaksanaan urutan dan membenarkan atur cara diteruskan.

Penyelesaian: Memahami Salah Tanggapan Kurungan

Isunya terletak pada tanda kurungan belakang selepas self.read(). Dalam Python, kurungan serta-merta mengikut fungsi memanggilnya, jadi kod berikut:

target=self.read()
Salin selepas log masuk

sebenarnya memanggil self.read dan menghantar nilai pulangannya sebagai hujah sasaran kepada Thread. Walau bagaimanapun, Thread mengharapkan rujukan fungsi, bukan nilai pulangan. Untuk membetulkan tingkah laku, hanya alih keluar kurungan dan gunakan t1.start() secara eksplisit selepas penciptaan benang:

t1 = threading.Thread(target=self.read)
t1.start()
print("something")
Salin selepas log masuk

Mengendalikan Argumen dalam Sasaran Benang

Apabila fungsi sasaran memerlukan hujah, gunakan hujah args atau kwargs untuk membuat threading.Thread. Sebagai alternatif, gunakan fungsi lambda, seperti yang ditunjukkan di bawah:

thread = threading.Thread(target=f, args=(a, b), kwargs={'x': c})
Salin selepas log masuk

atau

thread = threading.Thread(target=lambda: f(a, b, x=c))
Salin selepas log masuk

Ingat, jika menggunakan lambda, hujah fungsi dinilai apabila lambda digunakan, bukan apabila ia ditakrifkan. Ini boleh membawa kepada hasil yang tidak dijangka jika pembolehubah ditetapkan semula sebelum penjadualan urutan.

Atas ialah kandungan terperinci Mengapa Perlaksanaan Benang Saya Anomali Apabila Saya Tidak Menggunakan Benang dalam Python secara Eksplisit?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan