Apa itu coroutine? Bagaimana mereka terkait dengan konkurensi?
terminology
coroutine
yesraaj
sumber
sumber
Jawaban:
Coroutine dan concurrency sebagian besar bersifat orthogonal. Coroutine adalah struktur kontrol umum di mana kontrol aliran secara kooperatif dilewatkan di antara dua rutinitas yang berbeda tanpa kembali.
Pernyataan 'hasil' dalam Python adalah contoh yang baik. Itu menciptakan coroutine. Ketika 'hasil' ditemui, keadaan fungsi saat ini disimpan dan kontrol dikembalikan ke fungsi pemanggilan. Fungsi panggilan kemudian dapat mentransfer eksekusi kembali ke fungsi menghasilkan dan statusnya akan dikembalikan ke titik di mana 'hasil' ditemukan dan eksekusi akan berlanjut.
sumber
Coroutines are a general control structure whereby flow control is cooperatively passed between two different routines without returning.
<- ini adalah konkurensi. Kata yang Anda cari adalah paralelisme.orthogonal = Not similar to each other
?orthogonal
berarti "tidak tergantung satu sama lain".Dari Pemrograman di Lua ,
Coroutines
bagian " ":Jadi intinya adalah: Coroutine adalah "kolaboratif". Bahkan dalam sistem multi-core, hanya ada satu coroutine yang berjalan pada waktu tertentu (tetapi beberapa thread dapat berjalan secara paralel). Ada non-preemptive antara coroutine, coroutine yang berjalan harus melepaskan eksekusi secara eksplisit.
Untuk "
concurrency
", Anda dapat merujuk slide Rob Pike :Jadi selama eksekusi coroutine A, ia melewati kontrol ke coroutine B. Kemudian setelah beberapa waktu, coroutine B melewati kontrol kembali ke coroutine A. Karena ada ketergantungan antara coroutine, dan mereka harus berjalan bersama-sama, sehingga dua coroutine tidak konkurensi .
sumber
Saya menemukan sebagian besar jawaban terlalu teknis walaupun itu adalah pertanyaan teknis. Saya mengalami kesulitan mencoba memahami proses coroutine. Saya agak mendapatkannya tetapi kemudian saya tidak mendapatkannya pada saat yang sama.
Saya menemukan jawaban ini di sini sangat membantu:
https://dev.to/thibmaek/explain-coroutines-like-im-five-2d9
Mengutip dari Idan Arye:
Pasti memeriksa tautannya, ada banyak lagi yang saya tidak bisa kutip semuanya.
sumber
Coroutine mirip dengan subrutin / utas. Perbedaannya adalah begitu pemanggil memanggil subrutin / utas, itu tidak akan pernah kembali ke fungsi pemanggil. Tetapi coroutine dapat kembali ke pemanggil setelah mengeksekusi beberapa kode yang memungkinkan pemanggil untuk mengeksekusi beberapa kode sendiri dan kembali ke titik coroutine di mana ia menghentikan eksekusi dan melanjutkan dari sana. yaitu. Coroutine memiliki lebih dari satu titik masuk dan keluar
sumber
Pada dasarnya, ada dua jenis Coroutine:
Kotlin mengimplementasikan coroutine stackless - itu artinya coroutine tidak memiliki stack sendiri, sehingga mereka tidak memetakan pada thread asli.
Ini adalah fungsi untuk memulai coroutine:
Anda dapat belajar lebih banyak dari sini:
https://www.kotlindevelopment.com/deep-dive-coroutines/
https://blog.mindorks.com/what-are-coroutines-in-kotlin-bf4fecd476e9
sumber
Pada catatan yang berbeda, dalam
gevent
pustaka python adalah pustakacoroutine
jaringan berbasis yang memberi Anda fitur mirip-mirip seperti permintaan jaringan async, tanpa overhead untuk membuat dan menghancurkan utas. Thecoroutine
library yang digunakan adalahgreenlet
.sumber
Dari Python Coroutine :
Dari Coroutines (C ++ 20)
Bandingkan dengan jawaban orang lain:
Menurut pendapat saya, bagian yang dilanjutkan kemudian adalah perbedaan inti, seperti halnya @ Twinkle.
Meskipun banyak bidang dokumen masih dalam proses, bagian ini mirip dengan sebagian besar jawaban, kecuali @Nan Xiao.
Karena itu dikutip dari Program in Lua, mungkin itu terkait bahasa (tidak akrab dengan Lua saat ini), tidak semua dokumen menyebutkan hanya satu bagian.
Hubungannya dengan konkuren:
Ada bagian "Eksekusi" dari Coroutine (C ++ 20). Terlalu lama untuk mengutip di sini.
Selain detailnya, ada beberapa negara.
sebagai komentar dari @Adam Arold di bawah jawaban @ user217714. Ini konkurensi.
Tapi ini berbeda dari multithreading. dari std :: thread
Karena ini adalah konkurensi, ia berfungsi seperti multithreading terutama ketika menunggu tidak dapat dihindari (dari perspektif OS), itu juga mengapa membingungkan.
sumber
Coroutine adalah jenis khusus dari subprogram. Daripada hubungan master-slave antara penelepon dan subprogram yang disebut yang ada dengan subprogram konvensional, penelepon dan yang disebut coroutine lebih adil.
Coroutine adalah subprogram yang memiliki banyak entri dan mengendalikannya sendiri - didukung langsung di Lua
Juga disebut kontrol simetris: pemanggil dan yang disebut coroutine memiliki basis yang lebih setara
Panggilan coroutine dinamai resume
Resume pertama dari coroutine adalah untuk permulaan, tetapi panggilan berikutnya masuk pada titik tepat setelah pernyataan yang dieksekusi terakhir di coroutine
Coroutine berulang kali saling melanjutkan, mungkin selamanya
Coroutine menyediakan eksekusi kuasi-konkuren dari unit program (coroutine); eksekusi mereka disisipkan, tetapi tidak tumpang tindih
sumber
Saya menemukan penjelasan dari tautan ini cukup mudah. Tidak ada jawaban yang mencoba menjelaskan konkurensi vs paralelisme kecuali titik terakhir dalam jawaban ini .
dikutip dari "pemrograman Erlang", oleh Joe Armstrong, sang legendaris:
program bersamaan adalah program yang ditulis dalam bahasa pemrograman bersamaan. Kami menulis program bersamaan untuk alasan kinerja, skalabilitas, atau toleransi kesalahan.
bahasa pemrograman konkuren adalah bahasa yang memiliki konstruksi bahasa eksplisit untuk menulis program bersamaan. Konstruksi ini merupakan bagian integral dari bahasa pemrograman dan berperilaku dengan cara yang sama pada semua sistem operasi.
komputer paralel adalah komputer yang memiliki beberapa unit pemrosesan (CPU atau inti) yang dapat berjalan secara bersamaan.
Jadi konkurensi tidak sama dengan paralelisme. Anda masih dapat menulis program bersamaan pada komputer inti tunggal. Penjadwal pembagian waktu akan membuat Anda merasa program Anda berjalan secara bersamaan.
Program bersamaan memiliki potensi untuk berjalan secara paralel di komputer paralel tetapi tidak dijamin . OS hanya dapat memberi Anda satu inti untuk menjalankan program Anda.
Oleh karena itu, concurrency adalah model perangkat lunak dari program bersamaan yang tidak berarti program Anda dapat berjalan secara paralel secara fisik.
Sebuah. apakah itu mencapai konkurensi atau paralelisme?
Sederhananya, mari kita bahas pada komputer inti tunggal .
Concurrency dicapai dengan pembagian waktu dari OS. Utas menjalankan kode dalam kerangka waktu yang ditentukan pada inti CPU. Itu bisa didahului oleh OS. Ini juga dapat menghasilkan kontrol ke OS.
Coroutine, di sisi lain, menghasilkan kontrol ke coroutine lain di dalam utas, bukan ke OS. Jadi semua coroutine dalam utas masih mengeksploitasi kerangka waktu untuk utas itu tanpa menghasilkan inti CPU ke utas lain yang dikelola oleh OS.
Oleh karena itu, Anda dapat memikirkan coroutine yang mencapai pembagian waktu oleh pengguna bukan oleh OS (atau kuasi-paralelisme). Coroutine berjalan pada inti yang sama yang ditugaskan ke utas yang menjalankan coroutine tersebut.
Apakah Coroutine mencapai paralelisme? Jika itu adalah kode yang terikat CPU, tidak. Seperti pembagian waktu, itu membuat Anda merasa mereka berjalan secara paralel tetapi eksekusi mereka disisipkan tidak tumpang tindih. Jika terikat IO, ya, ia mencapai paralel dengan perangkat keras (perangkat IO) bukan oleh kode Anda.
b. bedanya dengan pemanggilan fungsi?
Seperti yang ditunjukkan gambar, tidak perlu menelepon
return
untuk beralih kontrol. Itu bisa menghasilkan tanpareturn
. Coroutine menyimpan dan membagikan status pada bingkai fungsi saat ini (tumpukan). Jadi ini jauh lebih ringan daripada fungsi karena Anda tidak perlu menyimpan register dan variabel lokal untuk ditumpuk dan mundur saat panggilancall ret
.sumber
Saya akan memperluas jawaban @ user21714. Coroutine adalah jalur eksekusi independen yang tidak dapat berjalan secara bersamaan. Mereka bergantung pada pengontrol - misalnya
python
perpustakaan pengontrol - untuk menangani peralihan di antara jalur ini. Tetapi agar ini bisa berhasil, coroutine sendiri perlu dipanggilyield
atau struktur serupa yang memungkinkan eksekusi mereka dijeda.Threads sebaliknya berjalan pada sumber daya komputasi independen dan secara paralel satu sama lain. Karena mereka menggunakan sumber daya yang berbeda, maka tidak perlu meminta imbal hasil untuk memungkinkan jalan eksekusi lainnya berjalan.
Anda dapat melihat efek ini dengan memulai program multihreaded - misalnya
jvm
aplikasi - di mana kedelapancore i7
core hyperthread Anda digunakan: Anda mungkin melihat utilisasi 797% padaActivity Monitor
atauTop
. Alih-alih saat menjalankanpython
program biasa - bahkan program dengancoroutines
ataupython threading
- pemanfaatannya akan maksimal 100%. Yaitu satu mesin hyperthread.sumber