Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Kemahiran pembangunan coroutine tak segerak: merealisasikan penjana pautan pendek serentak tinggi

Kemahiran pembangunan coroutine tak segerak: merealisasikan penjana pautan pendek serentak tinggi

PHPz
PHPzasal
2023-12-02 12:02:311105semak imbas

Kemahiran pembangunan coroutine tak segerak: merealisasikan penjana pautan pendek serentak tinggi

Kemahiran pembangunan coroutine tak segerak: penjana pautan pendek untuk mencapai keselarasan tinggi

Dengan pembangunan berterusan Internet, semakin banyak sumber seperti halaman web, aplikasi dan e-mel perlu dikongsi dan diakses melalui pautan. Pautan panjang biasanya menyebabkan kesulitan membaca dan menyalin, manakala pautan pendek boleh menyelesaikan masalah ini dan menjadikan pautan lebih ringkas.

Untuk memenuhi keperluan sebilangan besar pengguna untuk menjana pautan pendek pada masa yang sama, kami perlu melaksanakan penjana pautan pendek yang sangat serentak. Artikel ini akan memperkenalkan teknik pembangunan berdasarkan coroutine tak segerak untuk mencapai penjanaan pautan pendek yang cekap.

  1. Pengenalan kepada coroutine tak segerak

Coroutine tak segerak ialah teknologi pengaturcaraan serentak yang boleh mencapai pelaksanaan serentak tanpa sekatan dalam satu urutan. Berbanding dengan berbilang benang atau berbilang proses tradisional, coroutine tak segerak mempunyai kecekapan pelaksanaan yang lebih tinggi dan kurang overhed sistem. Model pengaturcaraan coroutine dalam Python terutamanya bergantung pada perpustakaan asyncio.

  1. Asynchronous HTTP Client

Untuk menjana pautan pendek, kami perlu memanggil perkhidmatan penjanaan pautan pendek melalui permintaan HTTP. Di sini, kita boleh menggunakan klien HTTP tak segerak untuk melaksanakan permintaan HTTP yang sangat serentak.

Berikut ialah contoh kod klien HTTP tak segerak yang dilaksanakan menggunakan perpustakaan aiohttp:

import aiohttp
import asyncio

async def fetch(session, url):
    async with session.get(url) as response:
        return await response.text()

async def main():
    async with aiohttp.ClientSession() as session:
        tasks = []
        for i in range(10):  # 假设需要生成10个短链接
            url = 'http://shortlink-service.com/generate'  # 短链接生成服务的URL
            task = asyncio.ensure_future(fetch(session, url))
            tasks.append(task)
        responses = await asyncio.gather(*tasks)
        print(responses)

if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main())

Dalam kod di atas, kami mentakrifkan fungsi ambil untuk menghantar permintaan HTTP GET dan mengembalikan kandungan respons. Dalam fungsi utama, kami mencipta sesi klien HTTP tak segerak dan menggunakan gelung for untuk mencipta 10 tugas tak segerak Setiap tugas akan memanggil fungsi ambil untuk menghantar permintaan HTTP. Akhir sekali, kami menggunakan fungsi asyncio.gather untuk menunggu semua tugasan selesai dan mencetak semua kandungan respons.

  1. Penjana pautan pendek

Kini kami boleh menggabungkan coroutine tak segerak dan klien HTTP tak segerak untuk melaksanakan penjana pautan pendek konkurensi tinggi. Katakan kita perlu menjana 1000 pautan pendek, berikut ialah kod sampel yang dipermudahkan:

import aiohttp
import asyncio

async def fetch(session, url, long_url):
    async with session.get(url, params={'long_url': long_url}) as response:
        return await response.text()

async def generate_short_links(long_urls):
    async with aiohttp.ClientSession() as session:
        tasks = []
        for long_url in long_urls:
            url = 'http://shortlink-service.com/generate'  # 短链接生成服务的URL
            task = asyncio.ensure_future(fetch(session, url, long_url))
            tasks.append(task)
        responses = await asyncio.gather(*tasks)
        return responses

if __name__ == '__main__':
    long_urls = ['http://example.com'] * 1000  # 假设有1000个长链接
    loop = asyncio.get_event_loop()
    short_links = loop.run_until_complete(generate_short_links(long_urls))
    print(short_links)

Dalam kod di atas, kami mentakrifkan fungsi generate_short_links untuk menjana pautan pendek. Fungsi ini menerima senarai pautan panjang sebagai parameter dan kemudian menggunakan klien HTTP tak segerak untuk menghantar permintaan HTTP GET untuk memanggil perkhidmatan penjanaan pautan pendek. Akhir sekali, kami menggunakan fungsi asyncio.gather untuk menunggu semua tugasan selesai dan mengembalikan semua kandungan respons.

Dengan contoh kod di atas, kami telah melaksanakan penjana pautan pendek berkonkurensi tinggi. Dengan menggunakan coroutine tak segerak dan klien HTTP tak segerak, kami boleh menjana sejumlah besar pautan pendek serentak dalam satu utas, meningkatkan keupayaan serentak sistem dan kelajuan tindak balas.

Ringkasan:

Artikel ini memperkenalkan teknik pembangunan berdasarkan coroutine tak segerak untuk melaksanakan penjana pautan pendek konkurensi tinggi. Kami menggunakan klien HTTP tak segerak untuk menghantar permintaan HTTP dan menggunakan pustaka asyncio untuk melaksanakan coroutine tak segerak. Melalui reka bentuk konkurensi yang munasabah, kami boleh meningkatkan prestasi dan kelajuan tindak balas sistem dan memenuhi keperluan sebilangan besar pengguna untuk menjana pautan pendek pada masa yang sama.

Atas ialah kandungan terperinci Kemahiran pembangunan coroutine tak segerak: merealisasikan penjana pautan pendek serentak tinggi. 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