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.


[crp]


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 🙂

Belajar Python: Membuat blog di terminal dengan mongodb

Inget dulu waktu kuliah membuat menu sederhana untuk menampilkan data dalam array di terminal dengan bahasa C. Dari situ saya bisa tahu apa itu fungsi, bagaimana cara memanggil fungsi lalu menampilkannya dalam screen terminal. Waktu itu kisaran tahun 2009-2010. Week lama juga ya..

Lanjut ke HTML, Javascript, PHP mulai diajarkan apa itu web dan cara membuat form lalu data masuk ke MySQL. Dari step-by-step tersebut saya yakin bahwa proses belajar itu mesti terstruktur dan berlanjut. Tidak ada proses belajar yang kilat. Saya pun gak seneng itu pesantren kilat #alah

Ingin nge-dalemin bahasa Python, step-nya pun saya pikir mesti begitu. Perlu kesabaran dan kini mesti di target sampai bisa buat ini mesti berapa hari dan setelah itu coba belajar yang lain kembali. Ada kawan yang mungkin umur sudah 40an tahun bergulat di dunia pemrograman. Dia sangat menikmati passion dan visioner tentang apa yang dia lakukan kedepan. Melihat pasar Indonesia yang katanya begitu ancur soal rates seorang programmer, dia cari kerjaan di Upwork dan akhirnya mendapatkan kesempatan bekerja di perusahaan luar dengan gaji dollar tapi biaya hidup pedesaan Indonesia..#manisbgt

Satu hal yang saya ambil dari dirinya itu adalah pengalaman tidak bisa dibeli. Orang lain punya skill yang banyak tapi pengalaman bekerja remote/freelance seperti negosiasi, cara komunikasi dengan sesama remote worker itu tidak bisa dibeli di Udemy ataupun kursus di Indonesia 😀

Weeh jadi ngelantur, intinya semangat belajar skill terbaru yang ingin kamu pelajari ya. Nikmati beberapa proses yang sedang kita jalani.

Saya baru aja mulai kembali untuk belajar Python nih di Udemy [https://www.udemy.com/the-complete-python-web-course-learn-by-building-8-apps/], beberapa kode saya masukan di github. Ini salah satunya: https://github.com/adiputra22/blog-python-terminal

Belajar Python: Fungsi While – Else

Lagi ngikutin tutorial di python. Ada yang menarik karena belum pernah liat kodingan di bahasa lain. While – Else ini bisa dijalankan di Python. Gunanya simple, Jika True, ulangi namun jika tidak True, lakukan perintah di block Else.

from random import randint

# Generates a number from 1 through 10 inclusive
random_number = randint(1, 10)

guesses_left = 3
# Start your game!

while guesses_left > 0:
    guess = int(raw_input("Your guess: "))
    guesses_left -= 1
    if guess == random_number:
        print "You win!"
        break
else:
    print "You lose."

Cakep ya. Python 🙂

Scrapping mudah dengan PyQuery

Inget dulu waktu scrapping menggunakan PHP cURL, harus setting ini, itu ono. Terus ketika hasil scrapping didapat, pecahin satu-satu tag nya. Cari value nya, posting dulu ajax nya, dan bla bla bla…

Ngobol sama temen, mending pake Python aja bro, cepet n gampang, ga sulit, banyak tool nya lagi. Bisa pake BeautifulSoup, PyQuery, Request, atau bawaan python. Akhirnya nyobain juga, pertama pake Request. Setelah itu nyobain pake PyQuery karena simple banget doc nya dibanding mesti liat doc Beautifulsoup. Pas nyobain,,brrrr, enyyyyakkk bener! rasa jquery bgt 😀 Continue reading Scrapping mudah dengan PyQuery