• Почему Go с горутинами работает на одном ядре?

    EvgenyMamonov
    @EvgenyMamonov Куратор тега Go
    Senior software developer, system architect
    Горутины выполняются на разных процессорах как и должны, у вас четвёртое число слишком большое, все горутины завершают выполнение, а одна продолжает работать. По этому и создаётся впечатление, что они все работают на одном ядре.

    Чтобы в этом убедиться добавим два fmt.Printf, чтобы получилось вот так
    package main
    
    import (
        "fmt"
        "runtime"
        "sync"
    )
    
    var wg sync.WaitGroup
    
    func main() {
        runtime.GOMAXPROCS(8)
        arr := []int{1343434, 1343434300, 234343400, 334343434000, 400434340, 203434340, 4232, 23545, 15535, 353535, 33434434, 5334345, 3533434345, 3535}
        for idx, el := range arr {
            wg.Add(1)
            go test(el, idx)
        }
        wg.Wait()
    }
    
    func test(el int, idx int) {
        fmt.Printf("%d started: %d\n", idx, el)
        for i := 0; i < el; i++ {
            el = el - 1
        }
        fmt.Printf("%d completed: %d\n", idx, el)
        defer wg.Done()
    }


    Вывод будет примерно таким
    4 started: 400434340
    8 started: 15535
    8 completed: 7767
    13 started: 3535
    13 completed: 1767
    6 started: 4232
    6 completed: 2116
    10 started: 33434434
    3 started: 334343434000
    7 started: 23545
    7 completed: 11772
    5 started: 203434340
    12 started: 3533434345
    11 started: 5334345
    2 started: 234343400
    1 started: 1343434300
    11 completed: 2667172
    9 started: 353535
    9 completed: 176767
    0 started: 1343434
    0 completed: 671717
    10 completed: 16717217
    5 completed: 101717170
    4 completed: 200217170
    2 completed: 117171700
    1 completed: 671717150
    12 completed: 1766717172

    При внимательном просмотре станет видно, что нет записи 3 completed.

    меняю элементы с индексами 4 и 5 на такие же числа 334343434000, 334343434000, т.е. делаем чтобы все горутины отработали, но чтобы 3 осталось, т.е. вот так

    arr := []int{1343434, 1343434300, 234343400, 334343434000, 334343434000, 334343434000, 4232, 23545, 15535, 353535, 33434434, 5334345, 3533434345, 3535}


    Запускаем заново и видим, что теперь 3 ядра отлично загружены
    %Cpu0  :  0.3 us,  1.0 sy,  0.0 ni, 98.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
    %Cpu1  :100.0 us,  0.0 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
    %Cpu2  :  1.7 us,  0.7 sy,  0.0 ni, 97.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
    %Cpu3  :  1.6 us,  2.9 sy,  0.0 ni, 95.5 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
    %Cpu4  :100.0 us,  0.0 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
    %Cpu5  :  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
    %Cpu6  :100.0 us,  0.0 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
    %Cpu7  :  5.6 us,  1.0 sy,  0.0 ni, 93.4 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
    Ответ написан
    Комментировать
  • Как распознать текст со скриншота?

    @kapp1
    1. Раздей скрин на блоки, чтобы не обрабатывать лишне, раздели по середине и обрабатывай отдельно тиму и противников.
    2. Удобно что ники на ENG, воспользуйся CV2 для подготовки фото и pytesseract для чтения
    3. Выходные данные сохрани как тебе удобно.

    Самое сложное это как всегда препроцессинг(61d1c93020f48943592528.png
    Ответ написан
    Комментировать
  • Существует ли облачное/серверное решение для хранения конфигураций проекта?

    SilenceOfWinter
    @SilenceOfWinter
    та еще зажигалка...
    приложение яндекс.диск или git + github.com
    Ответ написан
    Комментировать
  • Существует ли облачное/серверное решение для хранения конфигураций проекта?

    hint000
    @hint000
    у админа три руки
    Использую git для хранения конфигураций серверов.
    Ответ написан
    Комментировать
  • Существует ли облачное/серверное решение для хранения конфигураций проекта?

    leahch
    @leahch
    3D специалист. Dолго, Dорого, Dерьмово.
    Любая распределенная база типа consul.io, etcd, zookeeper..
    Ответ написан
    Комментировать
  • Работа с огромным количеством файлов?

    saboteur_kiev
    @saboteur_kiev
    software engineer
    bash отлично справится

    find . -name "file.ext" | xargs -n 10 -P 10 "phraze"
    Ответ написан
    Комментировать
  • Какие из бекенд фреймворков наиболее "самодостаточные"?

    Vamp
    @Vamp
    Ответ написан
    Комментировать
  • Как всё таки работает асинхронность?

    Vindicar
    @Vindicar
    RTFM!
    Передразнивая одного человека, асинхронность это кооперативная многозадачность плюс цикл обработки событий.

    Упрощенно, есть набор функций, умеющих приостанавливать и возобновлять своё выполнение - корутин.
    Корутины обычно приостанавливают своё выполнение после запроса операции ввода/вывода, но могут и по другим поводам - например, просто ожидание, или ожидание завершения другой корутины, или ещё что.

    Ядром асинхронной программы является паттерн "реактор" - рабочий цикл. В контексте клиентского JS это рабочий цикл браузера, в контексте ноды - что-то отдельное, я полагаю (с нодой не работал).
    Цикл делает следующее:
    - ожидает завершения одной из операций ввода/вывода или ожидания (любой)
    - определяет, какая корутина ожидала эту операцию
    - передаёт ей управление
    - корутина делает своё дело, обрабатывая результат операции
    - потом корутина либо завершается, либо планирует еще одну операцию. И цикл возобновляется.

    Отсюда и вытекают все плюсы и минусы. С одной стороны, переключение между корутинами происходит в явно указанные моменты времени, так что меньше возни с синхронизацией.
    С другой стороны, длинные вычисления так не распараллелишь - только ввод/вывод. Ну или в длинном вычислении время от времени делать паузу, но выигрыша все равно не будет. Так что это имеет смысл только для IO-bound программ.
    Ответ написан
    3 комментария
  • Как уменьшить размер занимаемого места массивом?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Можно ли как-то "сжать" все это дело?

    Скидывать логи сначала на диск, а потом кусками вычитывать и отображать.
    В памяти держать только некоторый адекватный кусок, чтобы успеть подгрузить следующую пачку, пока пользователь скроллит.
    Ответ написан
    4 комментария
  • Почему не получается обновить до php7.3 на Ubuntu 16?

    @rPman
    Потому что 16-ая версия ubuntu xenial устарела на два lts релиза, а через месяц уже будет три
    В указанном ppa нет сборок под xenial

    есть неофициальные архивы, так что с осторожностью:
    https://launchpad.net/~sergey-dryabzhinsky

    p.s. совет, если обновить систему никак не получится, виртуализируй что можешь, либо полноценными виртуалками либо с помощью lxc или docker
    Ответ написан
    Комментировать
  • Многократное использование len() или кеширование в переменную?

    WinPooh32
    @WinPooh32
    Stack Overflow answer searching expert
    Дескриптор у слайса имеет такую структуру:
    type SliceHeader struct {
            Pointer uintptr
            Len  int
            Cap  int
    }


    len(...) - это ключевое слово языка и в контексте компилятора не является функцией, вместо которой он может подставить что угодно.

    Выше мы выяснили, что у слайса есть поле с длиной, соответственно нет смысла кешировать длину в отдельной переменной. Т.к. компилятор просто заменит вызов len на обращение к полю в дескрипторе слайса. Он вообще может переместить длину в регистр процессора и не обращаться к ram при итерации.

    Если нужно экономить ресурсы, то лучше подумайте о неявной проверке на выход за границы массива, которая в некоторых случая может сожрать нехилую часть процессорного времени. Подробнее прочитать можно в этой статье.
    Ответ написан
    1 комментарий
  • В чём суть шутки про ноги в С/С++?

    Griboks
    @Griboks
    Просто раньше многие люди носили оружие, а особо глупые забывали ставить его на предохранители. Поэтому они могли случайно, держа пушку в руках, выстрелить. Ну а поскольку руки у человека "висят" ладонями вниз, то случайный выстрел почти всегда летит в ногу тебе либо близко стоящему человеку.
    Ответ написан
    Комментировать
  • Какой стек выбрать для бэкэнда?

    @dimuska139
    Backend developer
    Важна производительность, поэтому и стал вопрос о переходе от PHP/Laravel

    Тут вообще нет связи. Узким горлышком в таких проектах является не язык, на котором приложение написано, а база данных. Если медленно выполняются запросы, то хоть на ассемблере бэкенд напиши - быстрее сервер отвечать не будет. Ну может пару миллисекунд выиграете, но на фоне времени выполнения запроса в БД и сетевых издержек это смешные цифры - даже не заметите разницу. А если речь идёт о Django, то это вообще не про производительность, потому что этот фреймворк довольно тяжёлый сам по себе, да и Python - это далеко не самый производительный язык даже среди скриптовых.

    Если речь идёт про большие нагрузки, то тоже язык тут не особо при делах, потому что обеспечиваются они масштабированием, кешированием и оптимизацией запросов к БД. Язык приложения тут вообще не при чём - разве что памяти какой-то больше жрёт, какой-то меньше. 200к в сутки - это в среднем всего лишь 2-3 запроса в секунду - то есть вообще ни о чём. Понятно, что распределение посещаемости вряд ли непрерывное равномерное, но тем не менее 200к даже если за один час - это всего лишь 140 запросов в секунду. С такой нагрузкой справится любой современный язык и фреймворк даже без масштабирования, кстати.
    Ответ написан
    1 комментарий
  • Какой стек выбрать для бэкэнда?

    Stalker_RED
    @Stalker_RED
    На каждом из перечисленных стеков существуют гораздо более нагруженные проекты, чем 200к хитов.

    Выбирайте или то что вам уже знакомо, или то, что хотите изучить (если ваш заказчик готов оплачивать ваше саморазвитие).

    При масштабировании упор будет в хранение данных (БД) и взаимодействие сервисов. А на чем написаны сами сервисы не так важно, хоть все на разных языках.
    Ответ написан
    Комментировать
  • Как выполнить go run main.go при рестарте ubuntu?

    uvelichitel
    @uvelichitel Куратор тега Go
    habrahabr.ru/users/uvelichitel
    "Чтобы сервер запускался сразу при включении системы" вам не нужно выполнять go run main.go. go run -- это тестовые компиляция и запуск при эскизировании. Вам нужно сделать нормальный бинарник вашего сервера go build -o myserver main.go или go install. Полученный бинарник при включении системы можно запускать стандартными средствами -- юнитом systemd, записью cron или, самое простое, поместив команду в profile
    myserver &
    Ответ написан
    1 комментарий
  • Go get - connection refused, какие порты открывать?

    uvelichitel
    @uvelichitel Куратор тега Go
    habrahabr.ru/users/uvelichitel
    Go get под капотом использует git.
    git в качестве транспорта умеет использовать:
    • http - 80
    • https - 443
    • собственный протокол git - 9418
    • ssh - по умолчанию 22, но часто для безопасности меняют на кастомный(например 2222)

    Для связи протоколами git и ssh вы ещё должны иметь пару rsa ключей -- приватный у себя и публичный на git сервере.
    Ответ написан
    Комментировать
  • Мой код выглядит плохо или отлично?

    osvex
    @osvex
    Ответ написан
    Комментировать
  • Как запустить 5000 потоков параллельно с GET запросами?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Посмотрите на Swoole PHP – он хорошо умеет в неблокирующую асинхронность и корутины. Так сможете в меньшее число тредов запустить неблокирующие curl запросы. Swoole работает со стандартным libcurl – можно тот же GuzzleHTTP использовать.
    Ответ написан
    Комментировать
  • Как запустить 5000 потоков параллельно с GET запросами?

    Vamp
    @Vamp
    Распараллелить выполнение в самом воркере с помощью ReactPHP или лучше GuzzleAsync. В таком случае не придется держать 5000 воркеров именно

    Вариант с GuzzleAsync - самый лучший. Под капотом он использует возможности curl_multi_exec, которые позволяют асинхронно отправлять несколько запросов, не плодя при этом лишние процессы. Не уверен конечно, что осилит 5000 параллельных запросов, но даже если и не сможет, то можно разделить 5000 между несколькими воркерами.

    2. "Правильно ли" это вообще делать с помощью PHP или это все таки задача уже других языков которые умеют в параллельное выполнение, корутины? Go, NodeJs?

    У вас нагрузка в основном IO bound, так что не имет значения какой язык выбрать. Главное чтобы он поддерживал IO multiplexing (который поддерживается в PHP через вышеупомянутый curl_multi_exec).

    3. Может уже есть готовые решения в виде библиотек на PHP? Искал, но не нашел

    Guzzle
    Ответ написан
    3 комментария
  • На чём написан язык программирования C?

    Griboks
    @Griboks
    На С. Это называется раскруткой.
    Ответ написан
    Комментировать