Rumah > Artikel > pembangunan bahagian belakang > Amalan pembangunan coroutine tak segerak: membina sistem baris gilir mesej berprestasi tinggi
Amalan pembangunan coroutine tak segerak: membina sistem baris gilir mesej berprestasi tinggi
Dengan pembangunan Internet, sistem baris gilir mesej telah menjadi komponen utama dalam membina sistem pengedaran berprestasi tinggi dan berskala. Dalam membina sistem baris gilir mesej, aplikasi coroutine tak segerak boleh meningkatkan prestasi dan kebolehskalaan sistem dengan berkesan. Artikel ini akan memperkenalkan pembangunan praktikal coroutine tak segerak, mengambil membina sistem baris gilir mesej berprestasi tinggi sebagai contoh dan menyediakan contoh kod khusus.
1.1 Ringan: Coroutine tak segerak tidak perlu mencipta benang tambahan, dan hanya sebilangan kecil coroutine perlu dibuat untuk mencapai konkurensi berskala besar. Ini sangat mengurangkan penggunaan sumber sistem.
1.2 Kecekapan: Coroutine tak segerak menggunakan mekanisme I/O dan peristiwa yang tidak menyekat untuk mencapai penjadualan dan pemprosesan tugas yang cekap dengan overhed yang sangat rendah dan tidak tertakluk kepada overhed penukaran konteks.
1.3 Kebolehskalaan: Coroutine tak segerak boleh berkembang secara automatik apabila beban sistem meningkat, tanpa perlu melaraskan parameter secara manual seperti saiz kolam benang.
import asyncio message_queue = [] subscriptions = {} async def publish(channel, message): message_queue.append((channel, message)) await notify_subscribers() async def notify_subscribers(): while message_queue: channel, message = message_queue.pop(0) for subscriber in subscriptions.get(channel, []): asyncio.ensure_future(subscriber(message)) async def subscribe(channel, callback): if channel not in subscriptions: subscriptions[channel] = [] subscriptions[channel].append(callback) async def consumer(message): print("Received message:", message) async def main(): await subscribe("channel1", consumer) await publish("channel1", "hello world") if __name__ == "__main__": asyncio.run(main())
Dalam kod di atas, kami menggunakan senarai message_queue
untuk menyimpan mesej yang diterbitkan dan kamus langganan
untuk menyimpan pelanggan dan saluran yang sepadan. Fungsi publish
digunakan untuk menerbitkan mesej, fungsi notify_subscribers
digunakan untuk memberitahu pelanggan, fungsi subscribe
digunakan untuk melanggan saluran, dan consumer berfungsi sebagai contoh pengguna. <code>message_queue
列表来存储发布的消息,使用一个字典subscriptions
来存储订阅者和对应的通道。publish
函数用于发布消息,notify_subscribers
函数用于通知订阅者,subscribe
函数用于订阅某个通道,consumer
函数作为一个示例的消费者。
在main
函数中,我们首先使用subscribe
函数订阅了channel1
通道,并将consumer
函数指定为订阅者。然后我们使用publish
函数发布了一条消息到channel1
通道,notify_subscribers
会自动地将消息发送给订阅者。
下面是一个基于异步I/O和协程池的消息队列系统的优化示例代码:
import asyncio from concurrent.futures import ThreadPoolExecutor message_queue = [] subscriptions = {} executor = ThreadPoolExecutor() async def publish(channel, message): message_queue.append((channel, message)) await notify_subscribers() async def notify_subscribers(): while message_queue: channel, message = message_queue.pop(0) for subscriber in subscriptions.get(channel, []): await execute(subscriber(message)) async def execute(callback): loop = asyncio.get_running_loop() await loop.run_in_executor(executor, callback) async def subscribe(channel, callback): if channel not in subscriptions: subscriptions[channel] = [] subscriptions[channel].append(callback) async def consumer(message): print("Received message:", message) async def main(): await subscribe("channel1", consumer) await publish("channel1", "hello world") if __name__ == "__main__": asyncio.run(main())
在优化示例代码中,我们使用executor
来创建一个协程池,并通过execute
utama
, kami mula-mula melanggan saluran channel1
menggunakan fungsi subscribe
dan nyatakan consumer
fungsi untuk pelanggan. Kemudian kami menggunakan fungsi publish
untuk menerbitkan mesej ke saluran channel1
dan notify_subscribers
akan menghantar mesej secara automatik kepada pelanggan.
execute
. Ini boleh mengelakkan penukaran konteks yang berlebihan, melaksanakan fungsi panggil balik secara serentak dan meningkatkan keupayaan pemprosesan mesej. 🎜🎜Sudah tentu, dalam sistem baris gilir mesej sebenar, ia boleh dioptimumkan dan diperluaskan lagi, seperti memperkenalkan kegigihan mesej, mekanisme pengesahan mesej, pengembangan mendatar, dsb. 🎜🎜🎜Ringkasan🎜Artikel ini memperkenalkan pembangunan praktikal coroutine tak segerak, mengambil contoh pembinaan sistem baris gilir mesej berprestasi tinggi dan menyediakan contoh kod khusus. Coroutine tak segerak boleh mencapai penjadualan dan pemprosesan tugas yang cekap dengan overhed yang sangat rendah, dan boleh meningkatkan prestasi dan kebolehskalaan sistem dengan berkesan. Dengan menggabungkan teknologi seperti kumpulan I/O tak segerak dan coroutine, kami boleh mengoptimumkan dan mengembangkan sistem baris gilir mesej untuk menyesuaikan diri dengan senario dan keperluan aplikasi yang berbeza. 🎜🎜Atas ialah kandungan terperinci Amalan pembangunan coroutine tak segerak: membina sistem baris gilir mesej berprestasi tinggi. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!