2009-12-10 3 views
8

Есть ли способ гарантировать, что goroutine будет работать только в конкретном потоке ОС? Например, когда GUI-операции должны выполняться в потоке графического интерфейса, но может быть несколько goroutines с графическим интерфейсом.Принудительные goroutines в ту же самую нить

GOMAXPROCS(1) выполняет работу технически, но это побеждает цель многопоточности.

LockOSThread() также работает, но это предотвращает запуск другого горутина в этой нити.

Есть ли способ сделать это, или все, что требует того же потока, также работает в одном и том же городе?

ответ

8

Насколько мне известно, в настоящее время нет. Я думаю, что «go-like» способ сделать это - написать Goroutine, который запускается в потоке GUI и запросы сервисов от других goroutines, отправленных по каналу. Например, вы можете прочитать его с канала, который принимает указатели на функции, и выполнять эти функции.

+2

-1 Ваш ответ на вопрос «Есть ли способ гарантировать, что goroutine будет работать только в конкретном потоке ОС?» «пишет Goroutine, которая работает в потоке графического интерфейса»? Как это должно мне помочь? –

+3

Вы уже указали, что LockOSThread позволяет блокировать goroutine для определенного потока. Просто сделайте это для потока GUI. –

+0

Это позволяет вам блокировать goroutine в потоке * current *, а не в произвольном конкретном потоке. – robx

3

Почему вы хотите это сделать? Я считаю, что runtime.LockOSThread() необходимо, если вы создаете привязку библиотеки из C-кода, который использует локальное хранилище потоков. В противном случае просто дайте планировщику мультиплексировать goroutines для вас.

Обратите внимание, что runtime.LockOSThread() предотвращает запуск других горутов в этой ветке, пока вы не позвоните runtime.UnlockOSThread().

+0

1) Поскольку OP подразумевал, что GUI-код нуждается в goroutines для параллелизма, но может не захотеть распределять приоритет ресурсов ЦП с другим кодом, который требует более высокой пропускной способности, хотя это может быть нежелательным; 2) Возможность [ограничить порожденные горуты] (https://stackoverflow.com/questions/30646391/does-runtime-lockosthread-allow-child-goroutines-to-run-in-same-os-thread) к тому же OS-поток [может помочь в бесконтактном дизайне параллелизма] (https://github.com/keean/zenscript/issues/17#issuecomment-359338947). –

Смежные вопросы