Dasar Coroutine
9.1 Dasar Coroutine
Lua memberikan seluruh fungsi coroutine yang dijadikan satu dalam tabel coroutine. Fungsi create untuk membuat coroutine baru. Ini memiliki argumen tunggal. Sebuah fungsi dengan kode yang terdapat coroutine akan dijalankan. Ini akan mengembalikan nilai yang bertipe thread,yang menggambarkan coroutine baru. Sering sekali,argumen create berupa fungsi tanpa nama,seperti dibawah ini:
co = coroutine.create(function ()
print("hi")
end)
print(co) --> thread: 0x8071d98
Sebuah coroutine dapat berada satu diantara 3 bagian: suspended, running dan dead. Ketika kita membuat sebuah coroutine ini dimulai pada bagian suspended. Ini artinya bahwa sebuah coroutine tidak bisa berjalan dibadan program secara otomatis ketika kita membuat ini,kita dapat memeriksa bagian dari sebuah coroutine menggunakan fungsi status
print(coroutine.status(co)) --> suspended
Fungsi coroutine.resume untuk memulai eksekusi sebuah coroutine,merubah bagian dari suspended ke running.
coroutine.resume(co) --> hi
Pada contoh ini,badan coroutine secara sederhana mencetak “hi” dan berhenti, meninggalkan coroutine dalam bagian dead, dari sini tidak dapat kembali lagi:
print(coroutine.status(co)) --> dead
Hingga sekarang,coroutines terlihat tidak lebih dari jalur rumit untuk memanggil fungsi. Tonggak kekuatan yang sebenarnya dari coroutine,terletak pada fungsi yield, yang membolehkan Hingga sekarang,coroutines terlihat tidak lebih dari jalur rumit untuk memanggil fungsi. Tonggak kekuatan yang sebenarnya dari coroutine,terletak pada fungsi yield, yang membolehkan
co = coroutine.create(function () for i=1,10 do
print("co", i) coroutine.yield()
end end)
Sekarang ketika kita melanjutkan coroutine ini, akan memulai eksekusi dan menjalankan hingga yield pertama:
coroutine.resume(co) --> co 1
Jika kita periksa statusnya,kita dapat melihat coroutine pada posisi suspended dan oleh karena itu bisa dimulai lagi:
print(coroutine.status(co)) --> suspended
Dari sudut pandang coroutine,seluruh aktivitas yang terjadi ketika di suspend terjadi didalam pemanggilan yield. Ketika kita melanjutkan coroutine,memanggil yield dan eksekusi coroutine dilanjutkan hingga yield selanjutnya atau hingga selesai:
coroutine.resume(co) --> co 2 coroutine.resume(co) --> co 3 ... coroutine.resume(co) --> co 10 coroutine.resume(co) -- prints nothing
Selama panggilan terakhir untuk resume,badan coroutine selesai diputar dan kemudian dikembalikan,jadi coroutine sekarang berada pada posisi dead. Jika kita mencoba memanggil lagi,resume mengembalikan false ditambah pesan kesalahan:
print(coroutine.resume(co)) --> false cannot resume dead coroutine
Catatan: resume berjalan pada mode terlindungi. Oleh karena itu,jika terdapat kesalahan dalam sebuah coroutine,Lua tidak akan menampilkan pesan kesalahan,tetapi akan mengembalikan ini ke panggilan resume.
Sebuah fasilitas yang berguna dalam Lua adalah sepasang resume-yield dapat merubah data diantara mereka. Resume yang pertama,yang tidak memiliki yield yang tidak saling berhubungan, menunggu untuk.mengembalikan argumen tambahan sebagai argumen ke fungsi utama coroutine:
co = coroutine.create(function (a,b,c)
print("co", a,b,c)
end) coroutine.resume(co, 1, 2, 3) --> co 1 2 3
Sebuah pemanggilan resume kembali,setelah sinyal true menandakan tidak ada kesalahan,beberapa argumen diberikan ke yield yang bersesuaian: Sebuah pemanggilan resume kembali,setelah sinyal true menandakan tidak ada kesalahan,beberapa argumen diberikan ke yield yang bersesuaian:
coroutine.yield(a + b, a - b)
end) print(coroutine.resume(co, 20, 10)) --> true 30 10
Secara simetris, yield mengembalikan argumen tambahan yang diberikan ke resume yang bersesuaian:
co = coroutine.create (function ()
print("co", coroutine.yield())
end) coroutine.resume(co) coroutine.resume(co, 4, 5) --> co 4 5
Terakhir,ketika sebuah coroutine berakhir,nilai dikembalikan oleh fungsi utama ke resume yang bersesuaian:
co = coroutine.create(function ()
return 6, 7
end) print(coroutine.resume(co)) --> true 6 7
Kita jarang menggunakan seluruh fasilitas dalam coroutine yang sama,tetapi seluruhnya punya kegiatan. Untuk itu segala sesuatu yang sudah diketahui tentang coroutines,penting untuk diklarifikasi,beberapa konsep sebelum kita berlanjut. Lua memberikan apa yang disebut asymmetric coroutines ,artinya bahwa Lua memiliki sebuah fungsi untuk menunda eksekusi sebuah coroutine dan sebuah fungsi berbeda untuk mengaktifkan coroutine yang tertunda. Beberapa bahasa lain menawarkan symmetric coroutines,dimana hanya memilikisatu fungsi untuk mengatur transfer dari satu coroutine ke coroutine lain.
Beberapa orang menyebut asymmetric coroutine dengan semi-coroutine. Tetapi,orang lain menggunakan semi-coroutine untuk menggambarkan implementasi terbatas dari coroutines,dimana sebuah coroutine hanya dapat menunda eksekusi ketika tidak didalam fungsi pembantu,artinya ketika tidak ada pemanggilan yang tertunda berada dalam control stack. Dengan kata lain,hanya bagian utama dari semi-coroutines yang dapat berproduksi. Sebuah generator pada python adalah contoh dari semi-coroutines.
Tidak seperti perbedaan antara symmetric dan asymmetric coroutines,perbedaan antara coroutines dan generator ada satu yang mencolok. Generator sederhana tetapi tidak cukup kuat untuk implementasi beberapa susunan yang menarik yang dapat ditulis dengan baik oleh coroutines. Lua memberikan yang terbaik. Asymmetric coroutine. Tapi banyak yang memilih symmetric coroutine karena dapat diimplementasi diatas fasilitas asymmetric Lua. Ini pekerjaan mudah.