Способ узнать идентификатор горутины

235 views
Skip to first unread message

Artem Andreenko

unread,
Jul 9, 2014, 8:05:52 AM7/9/14
to gola...@googlegroups.com
Всем привет!

Как вам такой способ узнать идентификатор горутины?

func getGoroutineId() int {
    buf := make([]byte, 20)
    runtime.Stack(buf, false)
    for i, v := range buf[10:20] {
        if string(v) == " " {
            gId, err := strconv.Atoi(string(buf[10 : 10+i]))
            if err != nil {
                panic("Error converting goroutine ID")
            }
            return gId
        }
    }
    panic("Error extracting goroutine ID")
}

Артём.

Alexey Palazhchenko

unread,
Jul 9, 2014, 8:09:35 AM7/9/14
to gola...@googlegroups.com
> Как вам такой способ узнать идентификатор горутины?

Адище.

Зачем?

–-–
Алексей «AlekSi» Палажченко

Artem Andreenko

unread,
Jul 9, 2014, 8:15:31 AM7/9/14
to gola...@googlegroups.com
2014-07-09 16:09 GMT+04:00 Alexey Palazhchenko <alexey.pa...@gmail.com>:
> Как вам такой способ узнать идентификатор горутины?

Адище.

Зачем?

А просто спрашивали на одном из выступлений. Код не мой, наткнулся на github.
 

---
Алексей <<AlekSi>> Палажченко

--
Вы получили это сообщение, поскольку подписаны на группу Golang Russian.

Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес golang-ru+...@googlegroups.com.
Настройки подписки и доставки писем: https://groups.google.com/d/optout.

Alexey Palazhchenko

unread,
Jul 9, 2014, 8:21:39 AM7/9/14
to gola...@googlegroups.com
> А просто спрашивали на одном из выступлений. Код не мой, наткнулся на github.

Обычно это спрашивают люди, пришедшие с языков с тредами и thread-local storage, пытающиеся эмулировать последнее с помощью map[gorouitneId]interface{}. Либо люди, пришедшие с Erlang с именованными процессами и однозначно ассоциированными с ними mailbox’ами. В Go же горутины безымянны, а каналы – именованные (обычные переменные).

–-–
Алексей «AlekSi» Палажченко

Вячеслав Бахмутов

unread,
Jul 11, 2014, 6:20:45 AM7/11/14
to gola...@googlegroups.com
Для меня главный вопрос работы с горутинами в том, каким образом игнорировать runtime ошибку возникшую в горутине из сторонней библиотеки, правильное выполнение которой мне не важно?

среда, 9 июля 2014 г., 19:21:39 UTC+7 пользователь Alexey Palazhchenko написал:

Alexey Palazhchenko

unread,
Jul 11, 2014, 6:21:51 AM7/11/14
to gola...@googlegroups.com
> Для меня главный вопрос работы с горутинами в том, каким образом игнорировать runtime ошибку возникшую в горутине из сторонней библиотеки, правильное выполнение которой мне не важно?

Не игнорировать, а исправлять.

–-–
Алексей «AlekSi» Палажченко

Artem Andreenko

unread,
Jul 11, 2014, 6:22:54 AM7/11/14
to gola...@googlegroups.com
Исправлять не всегда удобно. Особенно, если это сторонний пакет.


2014-07-11 14:21 GMT+04:00 Alexey Palazhchenko <alexey.pa...@gmail.com>:
> Для меня главный вопрос работы с горутинами в том, каким образом игнорировать runtime ошибку возникшую в горутине из сторонней библиотеки, правильное выполнение которой мне не важно?

Не игнорировать, а исправлять.

Вячеслав Бахмутов

unread,
Jul 14, 2014, 1:51:27 AM7/14/14
to gola...@googlegroups.com
Всё подряд не исправишь, за всеми библиотеками не уследишь. 

пятница, 11 июля 2014 г., 17:21:51 UTC+7 пользователь Alexey Palazhchenko написал:

Morozov Alexandr

unread,
Jul 14, 2014, 2:01:38 AM7/14/14
to gola...@googlegroups.com
А за всеми и не нужно. Мне кажется вполне возможно уследить за тем что используешь в своих проектах.

понедельник, 14 июля 2014 г., 9:51:27 UTC+4 пользователь Вячеслав Бахмутов написал:

Aln Kapa

unread,
Jul 14, 2014, 4:23:43 AM7/14/14
to gola...@googlegroups.com
Вопрос в тему:

А какие языки позволяют такой делать? Контролировать работу библиотек, и что должно происходить когда библиотека кривая? 


14 июля 2014 г., 10:01 пользователь Morozov Alexandr <lk4d...@gmail.com> написал:
А за всеми и не нужно. Мне кажется вполне возможно уследить за тем что используешь в своих проектах.

понедельник, 14 июля 2014 г., 9:51:27 UTC+4 пользователь Вячеслав Бахмутов написал:
Всё подряд не исправишь, за всеми библиотеками не уследишь. 

--
Вы получили это сообщение, поскольку подписаны на группу "Golang Russian".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес golang-ru+...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

Morozov Alexandr

unread,
Jul 14, 2014, 4:35:12 AM7/14/14
to gola...@googlegroups.com
В go есть такая проблема, что паника в горутине в библиотеке положит вашу программу и вы ее никак не сможете поймать. Например берется нулевой элемент слайса без проверки длины, а вы ей передадите пустой слайс.
 И если в питоне всякая экзотика с тредами является скорее исключением, то в go натолкнуться на такую проблему намного легче. Соответственно в питоне контролировать поведение библиотек проще обработкой исключений и в принципе я ни разу не видел, чтобы библиотека на чистом питоне ложила всю программу.
В go я это видел, но это очень просто было найти и исправить.
понедельник, 14 июля 2014 г., 12:23:43 UTC+4 пользователь Aln Kapa написал:

Aln Kapa

unread,
Jul 14, 2014, 6:56:40 AM7/14/14
to gola...@googlegroups.com
ага python. 
Как мне кажется описанная вами проблема, отпадет еще на этапе компиляции.


14 июля 2014 г., 12:35 пользователь Morozov Alexandr <lk4d...@gmail.com> написал:

Morozov Alexandr

unread,
Jul 14, 2014, 7:03:51 AM7/14/14
to gola...@googlegroups.com
http://play.golang.org/p/I-pgH9t_Zj
Совсем не отпадает :) А можно еще и просто panic() бросить

понедельник, 14 июля 2014 г., 14:56:40 UTC+4 пользователь Aln Kapa написал:

Вячеслав Бахмутов

unread,
Jul 14, 2014, 7:04:05 AM7/14/14
to gola...@googlegroups.com
например Java, python.

понедельник, 14 июля 2014 г., 15:23:43 UTC+7 пользователь Aln Kapa написал:

Вячеслав Бахмутов

unread,
Jul 14, 2014, 7:05:12 AM7/14/14
to gola...@googlegroups.com
Не отпадёт.

понедельник, 14 июля 2014 г., 17:56:40 UTC+7 пользователь Aln Kapa написал:

Aln Kapa

unread,
Jul 14, 2014, 7:49:01 AM7/14/14
to gola...@googlegroups.com
ну блин, вы совсем не хотите нормальный код писать что ли? 

Такие вещи должный проверяться при написание библиотеки. 
Если  такой проверки не делается то я бы на вашем месте не стал использовать код, как бы крут он не был.
 


14 июля 2014 г., 15:05 пользователь Вячеслав Бахмутов <m0s...@gmail.com> написал:

Aln Kapa

unread,
Jul 14, 2014, 7:50:58 AM7/14/14
to gola...@googlegroups.com
Подскажите как это сделано в Java?


14 июля 2014 г., 15:04 пользователь Вячеслав Бахмутов <m0s...@gmail.com> написал:
например Java, python.


Aln Kapa

unread,
Jul 14, 2014, 7:54:51 AM7/14/14
to gola...@googlegroups.com
да и потом, обычно компилятор отлавливает подобное. 
Надо просто допилить компилятор и проблема уйдет.

Vladimir

unread,
Jul 14, 2014, 7:56:38 AM7/14/14
to gola...@googlegroups.com
Гарантированно проверить, будет ли горутина паниковать, нельзя проверить на этапе компиляции.


14 июля 2014 г., 18:54 пользователь Aln Kapa <aln...@gmail.com> написал:
да и потом, обычно компилятор отлавливает подобное. 
Надо просто допилить компилятор и проблема уйдет.

--

Aln Kapa

unread,
Jul 14, 2014, 8:18:26 AM7/14/14
to gola...@googlegroups.com
То есть фактический вам нужен способ выжить при падение программы. 
Мне кажется для этого лучше всего использовать watchdog таймер к основной программе.

А как проверка по id горутины (допустим они есть) тут спасает?



14 июля 2014 г., 15:56 пользователь Vladimir <de...@mechmind.net> написал:

Вячеслав Бахмутов

unread,
Jul 14, 2014, 11:15:58 AM7/14/14
to gola...@googlegroups.com
Проверка по id тут не причём =) про падение горутины это оффтопик.
Нужен не способ выжить при падении, а способ проигнорировать падение в модуле, выполнение которого не важно, но нужно.


понедельник, 14 июля 2014 г., 19:18:26 UTC+7 пользователь Aln Kapa написал:

Alexey Palazhchenko

unread,
Jul 14, 2014, 11:22:41 AM7/14/14
to gola...@googlegroups.com
> Нужен не способ выжить при падении, а способ проигнорировать падение в модуле, выполнение которого не важно, но нужно.

Чего-чего? Не важно, но нужно?

Вы ходите предотвратить панику во внешнем пакете? Не нужно этого делать, это не Erlang. :) Хорошие пакеты не паникуют. DON’T PANIC! Паника, вылетевшая из пакета – это баг, который нельзя игнорировать, можно только фиксить или выкидывать пакет.

–-–
Алексей «AlekSi» Палажченко

Вячеслав Бахмутов

unread,
Jul 14, 2014, 12:16:01 PM7/14/14
to gola...@googlegroups.com
Алексей, это всё хорошо в идеальном мире. В неидеальном всё работает до поры до времени, а потом падает на продакшене в самый неподходящий момент. Фиксить всё подряд не хватает времени. 

В любом случае, вы правы, и это всё решается, так или иначе. Мы просто обсуждаем, что такая проблема имеет место быть.

понедельник, 14 июля 2014 г., 22:22:41 UTC+7 пользователь Alexey Palazhchenko написал:

Anton Ageev

unread,
Jul 14, 2014, 2:14:34 PM7/14/14
to gola...@googlegroups.com
Вячеслав, подобное поведение действительно ненормальное. Как часто вы с ним сталкиваетесь? Если это единичный случай, то, имхо, это не повод затачивать под это язык, проще сделать pull request с исправлением ошибки.


--
Вы получили это сообщение, поскольку подписаны на группу "Golang Russian".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес golang-ru+...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.



--
WBR, Anton
Reply all
Reply to author
Forward
0 new messages