Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk melaksanakan pelayan rangkaian berprestasi tinggi menggunakan coroutine dan IO tak segerak dalam Python

Bagaimana untuk melaksanakan pelayan rangkaian berprestasi tinggi menggunakan coroutine dan IO tak segerak dalam Python

PHPz
PHPzasal
2023-10-27 18:36:171219semak imbas

Bagaimana untuk melaksanakan pelayan rangkaian berprestasi tinggi menggunakan coroutine dan IO tak segerak dalam Python

Cara menggunakan coroutine dan IO tak segerak dalam Python untuk melaksanakan pelayan rangkaian berprestasi tinggi

Pengenalan:
Dengan pembangunan Internet, keperluan prestasi pelayan rangkaian semakin tinggi dan lebih tinggi. Kaedah IO segerak tradisional selalunya tidak dapat memenuhi keperluan konkurensi yang tinggi, mengakibatkan tindak balas pelayan yang perlahan. Penggunaan coroutine dan IO tak segerak boleh meningkatkan prestasi serentak pelayan Artikel ini akan memperkenalkan cara menggunakan coroutine dan IO tak segerak dalam Python untuk melaksanakan pelayan rangkaian berprestasi tinggi.

1. Pengenalan kepada coroutine dan IO tak segerak
1.1 Coroutines
Coroutine ialah urutan ringan yang tidak memerlukan penjadualan oleh sistem pengendalian dan dijadualkan oleh pembangun sendiri. Ciri coroutine ialah mereka boleh melaksanakan pelaksanaan serentak berbilang tugas dalam satu utas, mengelakkan overhed penukaran benang.

1.2 Asynchronous IO (Asynchronous IO)
Asynchronous IO bermaksud bahawa apabila operasi IO sedang berjalan, CPU boleh melaksanakan tugas lain pada masa yang sama tanpa menunggu operasi IO selesai. Ini boleh meningkatkan penggunaan CPU.

2. Gunakan coroutine dan IO tak segerak untuk melaksanakan pelayan rangkaian
2.1 Bina rangka kerja pelayan
Pertama, kita perlu membina rangka kerja pelayan rangkaian asas. Rangka kerja IO tak segerak boleh dilaksanakan dengan mudah menggunakan modul asyncio yang disediakan oleh perpustakaan standard Python. Berikut ialah contoh mudah: asyncio模块可以方便地实现一个异步IO框架。下面是一个简单的实例:

import asyncio

async def handle_request(reader, writer):
    data = await reader.read(1024)
    message = data.decode()
    addr = writer.get_extra_info('peername')

    print(f"Received {message} from {addr}")

    writer.close()

async def main():
    server = await asyncio.start_server(
        handle_request, 'localhost', 8888)

    addr = server.sockets[0].getsockname()
    print(f"Serving on {addr}")

    async with server:
        await server.serve_forever()

asyncio.run(main())

上述代码实现了一个简单的网络服务器,它接收客户端的请求并输出到控制台。通过asyncio.start_server函数能够启动网络服务器,并通过server.serve_forever()使其保持运行。

2.2 使用协程处理请求
在网络服务器中,协程可以用来处理客户端的请求。例如,我们可以利用协程的特性,将网络请求与数据库操作、文件读写等异步操作结合起来。

import asyncio

async def handle_request(reader, writer):
    data = await reader.read(1024)
    message = data.decode()
    addr = writer.get_extra_info('peername')

    # 处理请求的逻辑
    response = await process_request(message)

    # 发送响应
    writer.write(response.encode())
    await writer.drain()

    writer.close()

async def process_request(message):
    # 处理请求的逻辑,比如数据库查询、文件读写等
    await asyncio.sleep(1) # 模拟耗时操作
    return "Hello, " + message

async def main():
    server = await asyncio.start_server(
        handle_request, 'localhost', 8888)

    addr = server.sockets[0].getsockname()
    print(f"Serving on {addr}")

    async with server:
        await server.serve_forever()

asyncio.run(main())

上述代码中,我们在handle_request函数中调用了process_request协程来处理请求。在process_request中可以完成一些耗时的操作,比如数据库查询、文件读写等。这样一来,服务器可以同时处理多个请求,并且能够及时响应客户端。

2.3 使用并发编程处理多个连接
在高并发的情况下,我们希望服务器能够同时处理多个请求,提高并发处理能力。为此,可以使用Python的asyncio提供的gather函数实现并发编程。

import asyncio

async def handle_request(reader, writer):
    data = await reader.read(1024)
    message = data.decode()
    addr = writer.get_extra_info('peername')

    # 处理请求的逻辑
    response = await process_request(message)

    # 发送响应
    writer.write(response.encode())
    await writer.drain()

    writer.close()

async def process_request(message):
    # 处理请求的逻辑,比如数据库查询、文件读写等
    await asyncio.sleep(1) # 模拟耗时操作
    return "Hello, " + message

async def main():
    server = await asyncio.start_server(
        handle_request, 'localhost', 8888)

    addr = server.sockets[0].getsockname()
    print(f"Serving on {addr}")

    async with server:
        await server.serve_forever()

asyncio.run(main())

main函数中,我们可以使用gather

async def main():
    server = await asyncio.start_server(
        handle_request, 'localhost', 8888)

    addr = server.sockets[0].getsockname()
    print(f"Serving on {addr}")

    await asyncio.gather(
        server.serve_forever(),
        some_other_task(),
        another_task()
    )

Kod di atas melaksanakan pelayan rangkaian mudah, yang menerima permintaan pelanggan dan mengeluarkannya ke konsol. Pelayan rangkaian boleh dimulakan melalui fungsi asyncio.start_server dan terus berjalan melalui server.serve_forever().

2.2 Gunakan coroutine untuk memproses permintaan

Dalam pelayan rangkaian, coroutine boleh digunakan untuk memproses permintaan pelanggan. Sebagai contoh, kita boleh menggunakan ciri coroutine untuk menggabungkan permintaan rangkaian dengan operasi tak segerak seperti operasi pangkalan data dan membaca dan menulis fail.
rrreee

Dalam kod di atas, kami memanggil coroutine process_request dalam fungsi handle_request untuk memproses permintaan. Beberapa operasi yang memakan masa boleh diselesaikan dalam process_request, seperti pertanyaan pangkalan data, membaca dan menulis fail, dsb. Dengan cara ini, pelayan boleh mengendalikan berbilang permintaan pada masa yang sama dan bertindak balas kepada pelanggan tepat pada masanya.

2.3 Gunakan pengaturcaraan serentak untuk mengendalikan berbilang sambungan
    Dalam kes konkurensi tinggi, kami berharap pelayan boleh mengendalikan berbilang permintaan pada masa yang sama untuk meningkatkan keupayaan pemprosesan serentak. Untuk tujuan ini, anda boleh menggunakan fungsi gather yang disediakan oleh asyncio Python untuk melaksanakan pengaturcaraan serentak.
  1. rrreee
  2. Dalam fungsi utama, kita boleh menggunakan fungsi gather untuk memproses berbilang permintaan serentak:
  3. rrreee
  4. Dengan cara ini, pelayan kami boleh mengendalikan berbilang permintaan pada masa yang sama Permintaan masa, prestasi concurrency bertambah baik.
🎜Kesimpulan: 🎜Artikel ini memperkenalkan cara menggunakan coroutine dan IO tak segerak dalam Python untuk melaksanakan pelayan rangkaian berprestasi tinggi. Dengan menggunakan coroutine untuk mengendalikan permintaan dan mengendalikan berbilang sambungan secara serentak, keupayaan pemprosesan pelayan boleh dipertingkatkan dengan baik. Melalui IO tak segerak, pelayan boleh menggunakan sepenuhnya sumber CPU tanpa menyekat utas utama apabila melakukan operasi IO. Kaedah ini sesuai untuk situasi konkurensi yang tinggi dan mempunyai kelebihan skala dan prestasi yang baik. 🎜🎜Rujukan:🎜🎜🎜https://docs.python.org/3/library/asyncio.html🎜🎜https://www.geekxh.com/0.10.%E5%9F%BA%E7%A1% 80 %E7%9F%A5%E8%AF%86/005.html🎜🎜

Atas ialah kandungan terperinci Bagaimana untuk melaksanakan pelayan rangkaian berprestasi tinggi menggunakan coroutine dan IO tak segerak dalam Python. 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