Bilakah anda harus menggunakan ciri `menunggu` Python 3.5 untuk asyncio, dan bilakah anda harus mengelaknya?

Barbara Streisand
Lepaskan: 2024-11-17 04:41:03
asal
814 orang telah melayarinya

When should you use Python 3.5's `await` feature for asyncio, and when should you avoid it?

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)
Salin selepas log masuk

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
Salin selepas log masuk

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:

  • Gunakan Multiprocessing: Laksanakan operasi jangka panjang dalam proses yang berasingan dan tunggu hasilnya:
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)
Salin selepas log masuk
  • Gunakan ThreadPoolExecutor: Untuk terikat I/O tugas segerak, seperti permintaan kepada pelayan web:
executor = ThreadPoolExecutor(2)

async def download(url):
    response = await loop.run_in_executor(executor, requests.get, url)
    return response.text
Salin selepas log masuk

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!

sumber:php.cn
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