Queue Proses dengan Celery

Proses antrian/queue pada artikel sebelumnya saya tulis dengan Laravel sudah dijelaskan bagaimana antrian bisa menghandle proses-proses yang memakan waktu lama, istilahnya kita jalankan di background system. Penasaran saya coba bagaimana Python melakukan hal yang sama. Setelah searching, ketemu Celery. Salah satu yang banyak digunakan oleh developer Python untuk membuat queue job pada aplikasi mereka. Pengguna salah satu ternama adalah Instagram, waw 🙂

Pada laravel, broker atau pengantar job/message bisa menggunakan Redis, RabitMQ, Database, ataupun SQS nya Amazon. Di Celery pun hampir semua bisa digunakan dan satu lagi kita bisa menyimpan hasil dari queue ke database atau nosql database, istilahnya backend result.

Penasaran, saya mau coba sederhana membuat task queue Celery dengan Python. Dan saya menemukan artikel yang mudah dan enak sekali dibaca.

https://www.agiliq.com/blog/2015/07/getting-started-with-celery-and-redis/

Sayangnya, artikel sudah 2015 ditulis, jadi mungkin ada perubahan. Btw, artikel ini enak banget dibaca dan mari kita coba implementasi sederhana.

Awalnya saya buat virtualenv dengan python 3 di folder project kita.

virtualenv venv -p python3

Lalu saya activekan virtual env dengan perintah

source venv/bin/activate

Setelah aktif, saya install Celery dan Requests karena pada artikel tersebut mencoba menjelaskan bagaimana mengakses (curl di php) website dengan python.

Install Celery

pip install -U "[celery-redis]"

Karena saya ingin menggunakan broker redis, maka install celery seperti diatas :), jika ingin menggunakan RabitMQ, installnya beda ya, coba cek documentasinya.

Setelah itu saya install requests

pip install requests

Seperti biasa, saya biasa membuat folder src lalu didalamnya berisi file app.py. Kode dari file tersebut adalah sebagai berikut:

from celery import Celery
import requests

app = Celery('app', broker='redis://localhost:6379/0')

@app.task
def fetch_url(url):
    resp = requests.get(url)
    print(resp.status_code)

def func(urls):
    for url in urls:
        fetch_url.delay(url)

if __name__ == "__main__":
    func(["http://google.com", "https://amazon.com", "https://facebook.com", "https://twitter.com", "https://alexa.com"])

Pada kode tersebut saya import celery lalu requests. Lalu saya buat object celery dengan nama app. Lalu terlihat ada broker url (redis) yang saya gunakan. Dari sini saja kita harus mengaktifkan redis-server pada linux kita. Jika ada yang belum ada redis, jangan lupa install dulu ya.

Sampai disitu, saya masukan decorator celery @app.task, dimana decorator tersebut memberikan flag/tanda bahwa fungsi tertentu (dalam hal ini fetch_url()) adalah fungsi yang bisa dijalankan dengan queue celery.

Dalam blok fungsi fetch_url() sederhana saja mengakses website lalu jika berhasil print kode hasil request.

Setelah itu, main fungsi adalah memanggil fungsi def func(urls), yang berisi list url website yang ingin diakses. Nah pada fungsi tersebut kita loop, lalu kita panggil fungsi decorator celery yaitu fetch_url() dengan penambahan fungsi .delay().

def func(urls):
    for url in urls:
        fetch_url.delay(url)

Jika anda tidak menggunakan celery atau queue system, proses ini masti berjalan menunggu hasil dari tiap-tiap website. Namun jika kita menggunakan queue, proses ini dijalankan di background sehingga proses menjadi lebih cepat.

Setelah itu, untuk mencobanya, mari kita coba jalankan perintah untuk mengaktifkan app.py tersebut sebagai celery queue.

celery -A app worker --loglevel=info

Dimana, anda mesti satu level folder dengan app.py. Sehingga akan menampilkan seperti gambar dibawah ini jika berhasil.

Pada gambar diatas, menandakan bahwa Celery anda siap untuk dijalankan. Mari kita coba panggil proses di app.py agar dijalankan oleh Celery sebagai queue.

python src/app.py

Jika dijalankan, proses pasti tidak menunggu lama ya. Dan jika dilihat ke terminal celery akan muncul seperti gambar ini:

Terlihat bahwa proses sudah dijalankan oleh Celery “succeeded”.

Beberapa fitur lain bisa dibaca di documentasi. Penjelasan lebih lengkap juga bisa dilihat di link diatas. Selamat mencoba 🙂

Leave a Reply

Your email address will not be published. Required fields are marked *

%d bloggers like this: