Dalam Python 3.5, pengenalan asyncio dan await membawa pengaturcaraan tak segerak ke hadapan. Anjakan paradigma ini membolehkan penyelarasan yang lebih besar dan pelaksanaan yang lebih pantas, namun sempadannya boleh mengelirukan. Artikel ini menyelidiki kehalusan masa untuk mengambil kerja dan bila untuk mengelak daripada menunggu.
Rasional utama untuk menerima menunggu terletak pada keupayaannya untuk memanfaatkan kuasa kod tak segerak. Pertimbangkan operasi I/O seperti permintaan rangkaian atau pembacaan fail. Perlaksanaan segerak bagi operasi ini biasanya menyekat keseluruhan program, memaksanya menunggu untuk selesai setiap tugas. Sebaliknya, kod tak segerak membenarkan operasi ini dilaksanakan serentak, membebaskan atur cara untuk mengendalikan tugasan lain.
# Synchronous Way download(url1) # takes 5 sec. download(url2) # takes 5 sec. # Total time: 10 sec. # Asynchronous Way await asyncio.gather( async_download(url1), # takes 5 sec. async_download(url2) # takes 5 sec. ) # Total time: 5 sec. (plus asyncio overhead)
Dalam contoh di atas, pendekatan tak segerak selesai dalam separuh masa, dengan berkesan meminimumkan masa terbuang yang dibelanjakan menunggu operasi I/O.
Sementara menunggu kecemerlangan dalam mengendalikan operasi I/O, ia tidak seharusnya digunakan secara sembarangan pada kod segerak. Kod segerak, seperti tugas terikat CPU atau manipulasi data mudah, tidak mendapat manfaat daripada paradigma tak segerak dan sebenarnya boleh memperkenalkan overhed yang tidak perlu.
# Synchronous Code That Should Remain Synchronous def parse(html): # This function does not involve any I/O operations. links = extract_links_from_html(html) return links
Mengirim kod segerak sebagai tak segerak tidak mempunyai tujuan dan boleh membawa kepada kemerosotan dalam prestasi.
Aspek penting untuk dipertimbangkan apabila menggunakan asyncio ialah kesan operasi segerak yang berjalan lama pada ekosistem tak segerak. Operasi segerak yang mengambil tempoh yang lama untuk dilaksanakan (mis., melebihi 50 ms) berpotensi membekukan semua operasi tak segerak yang sedang berjalan.
async def extract_links(url): data = await download(url) links = parse(data) # If search_in_very_big_file() takes a long time, # all ongoing async functions (elsewhere in code) will be suspended. links_found = search_in_very_big_file(links)
Untuk mengelakkan pembekuan ini, pertimbangkan untuk melaksanakan operasi yang berjalan lama itu dalam proses berasingan atau menggunakan kumpulan benang untuk operasi terikat I/O dalam konteks tak segerak.
Dalam Kesimpulannya, tunggu dalam Python 3.5 harus digunakan dengan bijak apabila berurusan dengan operasi I/O untuk memanfaatkan faedah konkurensi. Walau bagaimanapun, ia harus dielakkan untuk kod segerak dan operasi jangka panjang dalam ekosistem tak segerak untuk mengelakkan potensi perangkap prestasi dan kesesakan. Pertimbangan yang teliti terhadap prinsip ini akan memastikan penggunaan berkesan keupayaan tak segerak Python 3.5.
Atas ialah kandungan terperinci Bilakah saya harus menggunakan `menunggu` Python 3.5 dan bilakah saya harus mengelaknya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!