
Daniel
17.04.2018
13:19:37
в main ждать Wait()
ну и первый запуск Crawler сделать тоже в горутине

Roman
17.04.2018
13:20:34
хорошо, спасибо. есть идеи, почему не работает так, как сделано?

Daniel
17.04.2018
13:21:09
потому, что crawler блокируется на чтении из канала, и в него некому писать

Google

Roman
17.04.2018
13:22:20
если я правильно понял defer close(ch) должен прекратить ожидание. он вызывается в любом случае
на случай, если действительно некому писать

Daniel
17.04.2018
13:26:30
а как до дефера дело-то дойдет?
канал открыт, мы его читаем
а, не, там же сначала запись в канал, который некому читать

Crypt
17.04.2018
13:34:14
Если я в горутине делаю defer file.Close() и запускаю бесконечный цикл, defer выполнится при завершении main()?

Roman
17.04.2018
13:36:07
это я сегодня в доках читал :)

Crypt
17.04.2018
13:41:54
Итак, ответ - нет?)

Sergey
17.04.2018
13:42:46
defer не выполнится

Roman
17.04.2018
13:42:54
Итак, ответ - нет?)
исходя из вышеозвученного факта, мэйн не имеет прав что либо выполнить в горутине. думаю, что нет. но можно проверить

Sergey
17.04.2018
13:42:58
но дескриптор файловый освободится так или иначе)

Crypt
17.04.2018
13:49:34
Благодарю

Google

Александр
17.04.2018
13:51:51
нет

Crypt
17.04.2018
13:55:03
нет
что-то он даже до цикла не доходит)

Александр
17.04.2018
13:55:31
а он быстрый

Marlik
17.04.2018
14:10:26

Roman
17.04.2018
14:20:52

Marlik
17.04.2018
14:21:59
Если у вас парсер, то не обязательно юзать каналы. Каналы хороши когда вы мульён адресов пытаетесь читать паралельно...

Crypt
17.04.2018
14:22:33

Marlik
17.04.2018
14:24:46

Crypt
17.04.2018
14:25:13
так это можно и напитонить или нарубить быстрее

Roman
17.04.2018
14:25:43

Marlik
17.04.2018
14:25:55
Ну хз, с goquery за ночь с перекурами, с просмотрами киношек написал...
Причём, сначала собирал ссылки на отдельной странице, потом переходил по этим ссылкам, и выгребал картинки, текст и прочее...
А если бы знал синтаксис JQuery, было-бы быстрее... пришлось вспоминать как оно там...

Arch
17.04.2018
14:33:55
На gо есть целый фрейм для парсинга, colly

Marlik
17.04.2018
14:35:02

Arch
17.04.2018
14:35:07
Оно умеет само собирать ссылки и пробегаться по ним + всякие плюшки
http://go-colly.org

Google

Marlik
17.04.2018
14:36:15
Ага, я уже нашёл, спасибо.

Атас
17.04.2018
14:38:51

Roman
17.04.2018
14:44:51

Crypt
17.04.2018
14:49:56

Roman
17.04.2018
14:55:21
Т.е. это просто best practice озаботиться от случайностей?

Crypt
17.04.2018
15:03:15
)))))))0
не слушай меня в общем)
лок тоже не нужен

Roman
17.04.2018
15:03:36
В общем, благодаря примеру Атас я увидел кау пофиксить - нужно из мейна crawl запускать как горутину тоже
Но пока я не понял, почему не работает как у меня было в начале
Получается если не запускать как горутину, то до range в мейне никогда не дойдет, а значит читать будет некому?

Roman
17.04.2018
15:08:23
Канал закроется раньше return
В смысле, раньше чем начнетсч рэндж. Вот так
Спасибо всем за помощь ?

Crypt
17.04.2018
15:11:41
был с results
у тебя длина его равна кол-ву ссылок в первоначальной выдаче

Roman
17.04.2018
15:13:18

Crypt
17.04.2018
15:13:33
еще происходит захват i, который как раз таки равен этому кол-ву всегда

Google

Crypt
17.04.2018
15:13:55
и всегда приходит 1 результат, даже если Crawl как горутину пускать

Roman
17.04.2018
15:15:32

Crypt
17.04.2018
15:16:43
неа,
go func(u string, i int) {
....
}(u, i)
надо делать, когда переменные из ренжа передаёшь в горутину

Admin
ERROR: S client not available

Roman
17.04.2018
15:18:31

Атас
17.04.2018
15:21:12

Roman
17.04.2018
15:22:09
Походу, на этот индекс вообще не стоит полагаться. Нужно делать как у Атас в примере

Атас
17.04.2018
15:25:17

Crypt
17.04.2018
15:30:11
не обязательно можно и так
https://play.golang.org/p/42Z_j0c5SRE
хах, вот меня мучает вопрос: в чем разница между этим
result[i] = make(chan string)
go Crawl(u, depth-1, fetcher, cache, result[i])
и этим:
go func(u string,i int) {
result[i] = make(chan string)
Crawl(u, depth-1, fetcher, cache, result[i])
}(u,i)


Roman
17.04.2018
15:32:01
хах, вот меня мучает вопрос: в чем разница между этим
result[i] = make(chan string)
go Crawl(u, depth-1, fetcher, cache, result[i])
и этим:
go func(u string,i int) {
result[i] = make(chan string)
Crawl(u, depth-1, fetcher, cache, result[i])
}(u,i)
порядок выполнения разный
хах, вот меня мучает вопрос: в чем разница между этим
result[i] = make(chan string)
go Crawl(u, depth-1, fetcher, cache, result[i])
и этим:
go func(u string,i int) {
result[i] = make(chan string)
Crawl(u, depth-1, fetcher, cache, result[i])
}(u,i)
если не создавать result[i] сразу то range по нему ниже увидит пустую переменную
горутина завершится, те что в рекурсии повиснут


Anastasia
17.04.2018
15:38:19
#вакансия #golang #fulltime #москва #blockchain
Привет! Ищу Golang разработчика в международную fintech компанию (основное представительство в Ирландии), которая разрабатывает торговую платформу для трейдеров и инвесторов.
Стэк: Golang, PostgreSQL, RabbitMQ. Будет плюсом знание Python
Условия: ЗП до 250 т.р.+премии, оформление по контракту или ИП.
Офис в центре Москвы.
Команда сформирована из специалистов, участвовавших в развитии крупнейших банков (Deutsche, ING, Royal Bank). Сам проект тоже фондирован крупынми банками.
Если заинтересовались - присылайте резюме в личку :)

Zver
17.04.2018
15:43:26


Атас
17.04.2018
15:57:58
хах, вот меня мучает вопрос: в чем разница между этим
result[i] = make(chan string)
go Crawl(u, depth-1, fetcher, cache, result[i])
и этим:
go func(u string,i int) {
result[i] = make(chan string)
Crawl(u, depth-1, fetcher, cache, result[i])
}(u,i)
result[i] = make(chan string) внутри go func приводит к тому что в последующем range по result можно попасть на nil в его элементе, так как канал еще не успел создаться, горутины не успели до make дойти , а цикл их порождающий завершон и управление уже передано дальше и тогда ловим deadlock и делать так не стоит
а вариант https://play.golang.org/p/eqOcfS74CfN это лишний вызов функции и совсем не красиво, тем-более что вызов так же не бесплатен, это около 4ns лишних , так что почему и не написать сразу
result[i] = make(chan string)
go Crawl(u, depth-1, fetcher, cache, result[i])

Roman
17.04.2018
17:24:03
Парни, посоветуйте Socks proxy на Go
Хочу в цифровом сопротивлении поучаствовать и поираться с нагрузками

Dmitri
17.04.2018
17:25:51

Ilia
17.04.2018
17:26:12

Google

Ilia
17.04.2018
17:27:29
вторые сутки - полет нормальный

Roman
17.04.2018
17:27:47
Выдает это понятно. Насколько он стабильный/производительный?

Dmitri
17.04.2018
17:28:03
так 443 нормально для сокса юзать?

Crypt
17.04.2018
17:28:17

Ilia
17.04.2018
17:28:35
а фиг его знает… но в systemd пришлось строчку дописать чтоб стартануть не под рутом на этом порту

Crypt
17.04.2018
17:28:48

Roman
17.04.2018
17:29:01

Dmitri
17.04.2018
17:29:05
+ это порт для https

Roman
17.04.2018
17:29:23
1080 вроде стандартный порт

Dmitri
17.04.2018
17:29:27
+

Ilia
17.04.2018
17:29:30
чтоб никто не догадался!
=)
если серьезно - я просто посмотрел на каких портах крутили sock5 самые распиаренные прокси для телеги