Rumah > Artikel > pangkalan data > Penjelasan terperinci tentang pemprosesan tugas tak segerak dalam Redis
Memandangkan aplikasi web terus berkembang, keperluan untuk pemprosesan tugas tak segerak menjadi semakin penting, kerana kami perlu memastikan pengguna boleh terus menggunakan aplikasi itu sebelum menyelesaikan tugas. Dalam kes ini, kecuali pemprosesan tugas tak segerak, pemprosesan selari berbilang tugas tidak dapat dicapai, jadi selalunya perlu menggunakan beberapa alat untuk mengendalikan tugas tak segerak, antaranya Redis ialah alat yang sangat berguna.
Redis ialah pangkalan data dalam memori berprestasi tinggi yang boleh digunakan untuk menyimpan, membaca dan mengendalikan data dengan cepat. Kegunaan utamanya ialah untuk melaksanakan caching dan pemesejan, namun, ia juga boleh digunakan untuk mengendalikan tugas tak segerak. Redis mempunyai keupayaan beratur terbina dalam dan menerbitkan/langgan, yang menjadikannya alat yang sangat berguna untuk pemprosesan tugas tak segerak.
Dalam artikel ini, kami akan memperkenalkan cara menggunakan Redis untuk melaksanakan pemprosesan tugas tak segerak.
Pertama, kita perlu menggunakan klien Redis untuk mewujudkan sambungan dengan pelayan Redis. Mana-mana pelanggan yang menyokong sambungan Redis boleh digunakan. Python's redis-py adalah pilihan yang sangat baik. Sila pastikan anda memasang redis-py secara global:
pip install redis
Seterusnya, anda boleh mewujudkan sambungan Redis menggunakan arahan berikut:
import redis redis_conn = redis.Redis(host='localhost', port=6379, db=0)
Di sini kami telah mencipta contoh sambungan Redis bernama redis_conn, yang akan Sambung ke pelayan Redis setempat (host='localhost'), nombor port ialah 6379 (port=6379), dan gunakan pangkalan data No. 0 (db=0).
Redis Queue (RQ) ialah perpustakaan Python yang menggunakan Redis sebagai backend untuk melaksanakan baris gilir tugas yang diedarkan. RQ dibina atas arahan lpush dan rpop Redis, jadi ia mempunyai prestasi yang sangat baik.
Pasang RQ dan Redis:
pip install rq redis
Dalam tugasan segerak, utas utama akan melaksanakan semua kod dan menunggu tugasan untuk melengkapkan. Berikut ialah kod sampel untuk tugasan yang disegerakkan:
import time def task(): # 等待5秒 time.sleep(5) print('Task complete') print('Starting task') task() print('Task ended')
Dalam contoh di atas, kami telah menentukan fungsi yang dipanggil tugasan yang menunggu selama 5 saat dan kemudian mengeluarkan "Tugas selesai". Kemudian kami memanggil tugas ini dalam utas utama, output "Memulakan tugas", tunggu selama 5 saat, dan keluarkan "Tugas berakhir".
Pendekatan ini berfungsi untuk tugas jangka pendek, tetapi untuk tugasan jangka panjang ia boleh menyebabkan pengguna sangat tidak berpuas hati kerana mereka tidak boleh menggunakan aplikasi.
Sekarang, mari lihat cara menukar tugasan ini kepada tugasan tak segerak.
Idea untuk menukar tugas kepada tugas tak segerak adalah untuk melaksanakan tugas dalam urutan atau proses yang berasingan dan terus melaksanakan kod lain dalam benang utama. Dengan cara ini, pengguna boleh terus menggunakan aplikasi semasa tugasan dilakukan di latar belakang.
Dalam Python, anda boleh menggunakan benang atau proses untuk melaksanakan tugas latar belakang. Tetapi jika berbilang tugas sedang dijalankan, bilangan utas dan proses mungkin meningkat, dan ia juga mungkin mengalami masalah, seperti kebuntuan dan isu penyegerakan.
Menggunakan Redis boleh menyelesaikan masalah ini, kerana Redis mempunyai struktur baris gilir terbina dalam yang membolehkan kita mengelakkan masalah ini. Idea asas untuk melaksanakan tugas tak segerak dalam Redis adalah untuk mencipta baris gilir tugas dan menambah tugas pada baris gilir. Kemudian buat pelaksana tugas yang berasingan untuk mendapatkan tugasan dalam baris gilir dan laksanakannya.
Memandangkan Redis ialah pangkalan data dalam memori, anda boleh menggunakannya untuk menyimpan semua data baris gilir. Dengan cara ini kita boleh menyimpan status tugasan dalam Redis dan tidak perlu menggunakan urutan atau proses untuk mengendalikan tugasan.
Berikut ialah contoh kod untuk tugas tak segerak:
from rq import Queue from redis import Redis redis_conn = Redis() q = Queue(connection=redis_conn) def task(): # 等待5秒 time.sleep(5) print('Task complete') print('Starting task') job = q.enqueue(task) print('Task started')
Dalam kod di atas, kami mula-mula mencipta baris gilir Redis bernama q, dan kemudian mentakrifkan fungsi bernama tugas. Apabila memanggil tugas dalam utas utama, kami menambah tugasan pada baris gilir menggunakan kaedah enqueue objek baris gilir. Kaedah ini mengembalikan objek tugasan bernama kerja, yang mewakili tugasan dalam baris gilir. Kemudian kami mengeluarkan "Tugas dimulakan" dan pelaksana baris gilir akan mendapatkan tugas di latar belakang dan melaksanakannya.
Dalam contoh sebelumnya, kita boleh menggunakan objek kerja untuk memantau status tugas dan mendapatkan semula keputusan. Berikut ialah contoh kod tentang cara memantau tugasan:
from rq import Queue from redis import Redis redis_conn = Redis() q = Queue(connection=redis_conn) def task(): # 等待5秒 time.sleep(5) return 'Task complete' print('Starting task') job = q.enqueue(task) print('Task started') # 检查任务状态并获取结果 while job.result is None: print('Task still processing') time.sleep(1) print('Task complete: {}'.format(job.result))
Dalam kod di atas, kami menyemak sifat hasil tugasan sehingga ia tidak kosong. Kami kemudian mengeluarkan "Tugas selesai:" ditambah dengan hasil objek tugas.
Redis juga menyokong model terbitan/langgan (pub/sub), yang menjadikannya alat pemesejan yang sangat berguna. Dalam model ini, penerbit menerbitkan mesej kepada topik, dan pelanggan melanggan topik tersebut dan menerima semua mesej mengenai topik tersebut.
Mari kita ambil tugas tak segerak sebagai contoh untuk menggambarkan pelaksanaan menggunakan model terbitkan/langgan.
Pertama, kita perlu mencipta ID unik untuk setiap tugasan dan menambah tugasan pada baris gilir. Kami kemudian menerbitkan ID tugasan ke dalam topik. Pelaksana tugasan melanggan topik dan apabila ID tugasan diterima, ia mendapat tugas dan melaksanakannya.
Berikut ialah contoh kod untuk melaksanakan tugas tak segerak menggunakan model terbitkan/langgan:
from rq import Queue from redis import Redis import uuid redis_conn = Redis() q = Queue(connection=redis_conn) # 订阅任务主题并执行任务 def worker(): while True: _, job_id = redis_conn.blpop('tasks') job = q.fetch_job(job_id.decode('utf-8')) job.perform() # 发布任务并将其ID添加到队列中 def enqueue_task(): job = q.enqueue(task) redis_conn.rpush('tasks', job.id) def task(): # 等待5秒 time.sleep(5) return 'Task complete' print('Starting workers') for i in range(3): # 创建3个工作线程 threading.Thread(target=worker).start() print('Enqueueing task') enqueue_task() print('Task enqueued')
Dalam kod di atas, kami mula-mula mentakrifkan pelaksana tugas bernama worker, yang secara berterusan Menggelung dan membatalkan ID tugas yang dijadualkan daripada baris gilir. Apabila ia mendapat ID tugas, ia menggunakan kaedah fetch_job untuk mendapatkan objek tugas dan melaksanakannya.
Kami juga mentakrifkan fungsi yang dipanggil enqueue_task, yang mencipta tugas tak segerak yang dipanggil kerja dan menambahkan IDnya pada baris gilir. Kami kemudian memanggil fungsi ini dalam urutan utama dan menerbitkan ID tugasan ke topik yang dipanggil "tugas". Pelaksana tugas akan mendapat tugas dan melaksanakannya apabila ia menerima ID tugas.
Dalam artikel ini, kami memperkenalkan cara menggunakan Redis untuk melaksanakan pemprosesan tugas tak segerak. Kami menggunakan baris gilir, model terbitkan/langganan dan perpustakaan RQ dalam python, sambil menunjukkan cara menukar tugasan kepada mod tak segerak dan menggunakan tugas tak segerak untuk menyelesaikan masalah pengalaman pengguna. Redis sangat berguna apabila mengendalikan tugas tak segerak kerana ia menyediakan kefungsian baris gilir terbina dalam dan terbitkan/langgan dengan prestasi yang sangat baik. Jika anda ingin menjadikan aplikasi web anda responsif dan melaksanakan pemprosesan tugas tak segerak, Redis ialah pilihan yang baik.
Atas ialah kandungan terperinci Penjelasan terperinci tentang pemprosesan tugas tak segerak dalam Redis. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!