LittleBuster
@LittleBuster

Println, Scan и многопоточность?

Вопрос такой: после того, как я набираю в консоли какое-то слово и нажимаю Enter, оно отпечатывается только после очередного срабатывания задержки for из функции my вместе с очередным числом k, несмотря на то, что my выполняется в отдельном потоке. Как вывести Println после scan-a без задержки по времени? независимо от my

package main

import "fmt"
import "strconv"

func my() {
	var k int = 0
	for {
		for i:=0; i < 10000000000; i++ {
		}
		k++
		fmt.Println(strconv.Itoa(k))
	}
}

func main() {
	fmt.Println("test")
	go my()

	for {
		var p string
		fmt.Scanln(&p)
		fmt.Println("string from go: " + p)
	}
}
  • Вопрос задан
  • 302 просмотра
Решения вопроса 1
@SilentFl
Ваша ошибка заключается в недопонимании, что же такое горутина. Горутина != поток. Горутины можно рассматривать как некие блоки кода, которые рантайм может исполнять в произвольном порядке (с ощущением что они исполняются параллельно), и если началось исполнение горутины - то оно уже не прервется (с оговоркой - переключение между горутинами все-таки есть, на io-операциях).
Решение простое - нужно сказать рантайму чтобы он не в один поток (в рамках терминов ОС) исполнял код. Например вот так
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы