Apakah ada cara untuk melakukan tugas latar belakang berulang di Go? Saya sedang memikirkan sesuatu seperti Timer.schedule(task, delay, period)
di Jawa. Saya tahu saya bisa melakukan ini dengan goroutine dan Time.sleep()
, tetapi saya ingin sesuatu yang mudah dihentikan.
Inilah yang saya dapatkan, tetapi terlihat jelek bagi saya. Apakah ada cara yang lebih bersih / lebih baik?
func oneWay() {
var f func()
var t *time.Timer
f = func () {
fmt.Println("doing stuff")
t = time.AfterFunc(time.Duration(5) * time.Second, f)
}
t = time.AfterFunc(time.Duration(5) * time.Second, f)
defer t.Stop()
//simulate doing stuff
time.Sleep(time.Minute)
}
t := time.Tick(time.Duration(period) * time.Second)
mana periode adalahint
Jawaban:
Fungsi
time.NewTicker
membuat saluran yang mengirim pesan berkala, dan menyediakan cara untuk menghentikannya. Gunakan sesuatu seperti ini (belum diuji):Anda dapat menghentikan pekerja dengan menutup
quit
saluran:close(quit)
.sumber
do stuff
rutinitas go atau pekerja berikutnya akan segera mengeksekusi (ketika membutuhkan lebih dari 5 detik).close(quit)
ketika Anda ingin menghentikan penjadwal.go func() { /*do stuff */ }()
.Bagaimana dengan sesuatu seperti
Tempat bermain
sumber
time.Ticker
lebih baik daripada ditime.After
mana Anda lebih suka untuk menjaga tugas sesuai jadwal vs kesenjangan sewenang-wenang antara eksekusi.If efficiency is a concern, use NewTimer
Jika Anda tidak peduli dengan perubahan centang (tergantung pada berapa lama yang diperlukan sebelumnya pada setiap eksekusi) dan Anda tidak ingin menggunakan saluran, dimungkinkan untuk menggunakan fungsi rentang asli.
yaitu
Tempat bermain
sumber
Lihat perpustakaan ini: https://github.com/robfig/cron
Contoh seperti di bawah ini:
sumber
Jawaban yang lebih luas untuk pertanyaan ini mungkin mempertimbangkan pendekatan bata Lego yang sering digunakan di Occam, dan ditawarkan kepada komunitas Jawa melalui JCSP . Ada presentasi yang sangat bagus dari Peter Welch tentang ide ini.
Pendekatan plug-and-play ini diterjemahkan langsung ke Go, karena Go menggunakan fundamental Proses Berkomunikasi yang sama seperti halnya Occam.
Jadi, ketika datang untuk merancang tugas berulang, Anda dapat membangun sistem Anda sebagai jaringan aliran data komponen sederhana (sebagai goroutine) yang bertukar peristiwa (yaitu pesan atau sinyal) melalui saluran.
Pendekatan ini bersifat komposisional: setiap kelompok komponen kecil itu sendiri dapat berperilaku sebagai komponen yang lebih besar, ad infinitum. Ini bisa sangat kuat karena sistem konkuren kompleks dibuat dari batu bata yang mudah dimengerti.
Catatan Kaki: dalam presentasi Welch, ia menggunakan sintaks Occam untuk saluran, yaitu ! dan ? dan ini secara langsung berhubungan dengan ch <- dan <-ch in Go.
sumber
Saya menggunakan kode berikut:
Ini lebih sederhana dan berfungsi dengan baik untuk saya.
sumber
Jika Anda ingin menghentikannya kapan saja ticker
Jika Anda tidak ingin menghentikannya, centang :
sumber