Bila Gunakan dan Elakkan Ciri menunggu Python 3.5 untuk Asyncio
Python 3.5 memperkenalkan kata kunci await untuk memudahkan pengaturcaraan tak segerak dengan asyncio. Walau bagaimanapun, ia tidak selalunya jelas operasi yang perlu ditunggu untuk memaksimumkan kecekapan.
Menentukan Calon Asynchronous
Peraturan biasa ialah menunggu sebarang fungsi yang melaksanakan I/ Operasi O, seperti mengakses rangkaian atau membaca fail. Operasi ini berpotensi menyekat kod segerak untuk tempoh yang panjang. Dengan menunggunya, asyncio boleh melakukan operasi lain secara serentak.
Kelebihan Kod Asynchronous
Seperti yang ditunjukkan dalam coretan kod di bawah, kod tak segerak boleh mempercepatkan operasi yang melibatkan dengan ketara berbilang I/O panggilan:
# 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: only 5 sec. (+ little overhead for using asyncio)
Fungsi dengan Campuran Kod Tak segerak/Segerak
Fungsi tak segerak boleh memanggil kedua-dua fungsi tak segerak dan segerak. Walau bagaimanapun, tiada kelebihan dalam menunggu kod segerak yang tidak melaksanakan operasi I/O. Ini boleh memperkenalkan overhed yang tidak perlu:
async def extract_links(url): # async_download() was created async to get benefit of I/O html = await async_download(url) # parse() doesn't work with I/O, there's no sense to make it async links = parse(html) return links
Elakkan Operasi Segerak Berjangka Panjang
Adalah penting untuk mengelakkan operasi segerak berjalan lama (> 50 ms) dalam tak segerak fungsi, kerana ia boleh membekukan semua tugas tak segerak yang lain. Untuk mengendalikan tugas ini dengan cekap:
executor = ProcessPoolExecutor(2) async def extract_links(url): data = await download(url) links = parse(data) # Now your main process can handle another async functions while separate process running links_found = await loop.run_in_executor(executor, search_in_very_big_file, links)
executor = ThreadPoolExecutor(2) async def download(url): response = await loop.run_in_executor(executor, requests.get, url) return response.text
Atas ialah kandungan terperinci Bilakah anda harus menggunakan ciri `menunggu` Python 3.5 untuk asyncio, dan bilakah anda harus mengelaknya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!