Pemrograman Berbasis Peristiwa
Pemrograman berbasis acara berfokus pada acara. Akhirnya, aliran program bergantung pada peristiwa. Sampai saat ini, kami berurusan dengan model eksekusi sekuensial atau paralel, tetapi model yang memiliki konsep pemrograman berbasis peristiwa disebut model asinkron. Pemrograman yang digerakkan oleh peristiwa bergantung pada loop peristiwa yang selalu mendengarkan peristiwa baru yang masuk. Cara kerja pemrograman berbasis peristiwa bergantung pada peristiwa. Setelah peristiwa berulang, peristiwa memutuskan apa yang akan dijalankan dan dalam urutan apa. Diagram alur berikut akan membantu Anda memahami cara kerjanya -
Modul Python - Asyncio
Modul Asyncio ditambahkan di Python 3.4 dan menyediakan infrastruktur untuk menulis kode serentak utas tunggal menggunakan rutinitas bersama. Berikut adalah konsep berbeda yang digunakan oleh modul Asyncio -
Perulangan acara
Event-loop adalah fungsionalitas untuk menangani semua event dalam kode komputasi. Ini bertindak sepanjang jalan selama pelaksanaan seluruh program dan melacak masuk dan pelaksanaan acara. Modul Asyncio memungkinkan satu perulangan kejadian per proses. Berikut adalah beberapa metode yang disediakan oleh modul Asyncio untuk mengelola loop peristiwa -
loop = get_event_loop() - Metode ini akan menyediakan loop acara untuk konteks saat ini.
loop.call_later(time_delay,callback,argument) - Metode ini mengatur callback yang akan dipanggil setelah detik time_delay tertentu.
loop.call_soon(callback,argument)- Metode ini mengatur callback yang akan dipanggil sesegera mungkin. Callback dipanggil setelah call_soon () kembali dan ketika kontrol kembali ke event loop.
loop.time() - Metode ini digunakan untuk mengembalikan waktu saat ini sesuai dengan jam internal loop peristiwa.
asyncio.set_event_loop() - Metode ini akan menyetel loop acara untuk konteks saat ini ke loop.
asyncio.new_event_loop() - Metode ini akan membuat dan mengembalikan objek loop peristiwa baru.
loop.run_forever() - Metode ini akan berjalan sampai metode stop () dipanggil.
Contoh
Contoh event loop berikut membantu dalam pencetakan hello worlddengan menggunakan metode get_event_loop (). Contoh ini diambil dari dokumen resmi Python.
import asyncio
def hello_world(loop):
print('Hello World')
loop.stop()
loop = asyncio.get_event_loop()
loop.call_soon(hello_world, loop)
loop.run_forever()
loop.close()
Keluaran
Hello World
Futures
Ini kompatibel dengan kelas concurrent.futures.Future yang mewakili komputasi yang belum diselesaikan. Berikut perbedaan antara asyncio.futures.Future dan concurrent.futures.Future -
result () dan exception () tidak mengambil argumen batas waktu dan memunculkan pengecualian ketika masa depan belum selesai.
Callback terdaftar dengan add_done_callback () selalu dipanggil melalui event loop call_soon ().
Kelas asyncio.futures.Future tidak kompatibel dengan fungsi wait () dan as_completed () dalam paket concurrent.futures.
Contoh
Berikut ini adalah contoh yang akan membantu Anda memahami cara menggunakan kelas asyncio.futures.future.
import asyncio
async def Myoperation(future):
await asyncio.sleep(2)
future.set_result('Future Completed')
loop = asyncio.get_event_loop()
future = asyncio.Future()
asyncio.ensure_future(Myoperation(future))
try:
loop.run_until_complete(future)
print(future.result())
finally:
loop.close()
Keluaran
Future Completed
Coroutine
Konsep coroutine di Asyncio mirip dengan konsep objek Thread standar di bawah modul threading. Ini adalah generalisasi dari konsep subrutin. Sebuah coroutine dapat ditangguhkan selama eksekusi sehingga menunggu pemrosesan eksternal dan kembali dari titik di mana ia telah berhenti saat pemrosesan eksternal selesai. Dua cara berikut membantu kami dalam mengimplementasikan coroutine -
fungsi def asinkron ()
Ini adalah metode untuk implementasi coroutine di bawah modul Asyncio. Berikut ini adalah skrip Python untuk hal yang sama -
import asyncio
async def Myoperation():
print("First Coroutine")
loop = asyncio.get_event_loop()
try:
loop.run_until_complete(Myoperation())
finally:
loop.close()
Keluaran
First Coroutine
@ dekorator asyncio.coroutine
Metode lain untuk implementasi coroutines adalah dengan menggunakan generator dengan dekorator @ asyncio.coroutine. Berikut ini adalah skrip Python untuk hal yang sama -
import asyncio
@asyncio.coroutine
def Myoperation():
print("First Coroutine")
loop = asyncio.get_event_loop()
try:
loop.run_until_complete(Myoperation())
finally:
loop.close()
Keluaran
First Coroutine
Tugas
Subclass dari modul Asyncio ini bertanggung jawab untuk mengeksekusi coroutine dalam event loop secara paralel. Mengikuti skrip Python adalah contoh pemrosesan beberapa tugas secara paralel.
import asyncio
import time
async def Task_ex(n):
time.sleep(1)
print("Processing {}".format(n))
async def Generator_task():
for i in range(10):
asyncio.ensure_future(Task_ex(i))
int("Tasks Completed")
asyncio.sleep(2)
loop = asyncio.get_event_loop()
loop.run_until_complete(Generator_task())
loop.close()
Keluaran
Tasks Completed
Processing 0
Processing 1
Processing 2
Processing 3
Processing 4
Processing 5
Processing 6
Processing 7
Processing 8
Processing 9
Transportasi
Modul Asyncio menyediakan kelas transport untuk mengimplementasikan berbagai jenis komunikasi. Kelas-kelas ini tidak aman untuk thread dan selalu dipasangkan dengan instance protokol setelah pembuatan saluran komunikasi.
Berikut adalah jenis transportasi berbeda yang diwarisi dari BaseTransport -
ReadTransport - Ini adalah antarmuka untuk transport read-only.
WriteTransport - Ini adalah antarmuka untuk transport hanya menulis.
DatagramTransport - Ini adalah antarmuka untuk mengirim data.
BaseSubprocessTransport - Mirip dengan kelas BaseTransport.
Berikut adalah lima metode berbeda dari kelas BaseTransport yang selanjutnya bersifat sementara di empat jenis transportasi -
close() - Ini menutup transportasi.
is_closing() - Metode ini akan mengembalikan nilai true jika transportasi ditutup atau sudah ditutup.
get_extra_info(name, default = none) - Ini akan memberi kita informasi tambahan tentang transportasi.
get_protocol() - Metode ini akan mengembalikan protokol saat ini.
Protokol
Modul Asyncio menyediakan kelas dasar yang dapat Anda subkelas untuk mengimplementasikan protokol jaringan Anda. Kelas-kelas tersebut digunakan dalam hubungannya dengan transportasi; protokol mem-parsing data yang masuk dan meminta penulisan data keluar, sedangkan transport bertanggung jawab atas I / O dan buffering yang sebenarnya. Berikut adalah tiga kelas Protokol -
Protocol - Ini adalah kelas dasar untuk mengimplementasikan protokol streaming untuk digunakan dengan transport TCP dan SSL.
DatagramProtocol - Ini adalah kelas dasar untuk mengimplementasikan protokol datagram untuk digunakan dengan transport UDP ..
SubprocessProtocol - Ini adalah kelas dasar untuk mengimplementasikan protokol yang berkomunikasi dengan proses anak melalui satu set pipa searah.