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
Linda Hamiltonasal
2024-11-09 15:48:02319semak imbas

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,))

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()

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")

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})

atau

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

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:
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