1. Lua / Говнокод #24660

    −2

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    return coroutine.create(function(x) 
        while true do
          socket.sleep(1);
          collectgarbage() 
          coroutine.yield() 
        end 
      end)

    Выделил сборщик мусора в отдельный поток, и чтоб он вечно собирал за мной всякую срань, но раз в секунду.
    Ожидание: Поток спит в течении 1 секунды.
    Реальность: Вся программа спит в течении 1 секунды.

    Запостил: 3oJIoTou_xyu, 26 Августа 2018

    Комментарии (41) RSS

    • показать все, что скрытоvanished
      Ответить
    • > coroutine
      > поток
      Ну-ну.
      Ответить
      • Загугли
        Ответить
        • Загуглить что корутина не тред и не может выполняться в фоне? Ну я это и так знаю.
          Ответить
          • Lua supports coroutines, also called collaborative multithreading. A coroutine in Lua represents an independent thread of execution. Unlike threads in multithread systems, however, a coroutine only suspends its execution by explicitly calling a yield function. Type thread.
            Ответить
            • Понапишут хуйни, а люди потом путаются...
              Ответить
              • Кто из нас больше всего запутался?
                Ответить
                • Ты. Чтобы корутины юзать как аналог тредов нужны неблокирующие sleep, read, write и т.п. которые yield'ят управление вместо блокировки. И нужен внешний планировщик который будет resume'ить корутины когда сокет готов к чтению или прошло нужное время.

                  Твой socket.sleep() именно так и устроен? Судя по "вся программа спит секунду" -- нет.
                  Ответить
                  • Он не мой. Это из либы сокета.
                    Информативно описано:
                    Freezes the program execution during a given amount of time.
                    Time is the number of seconds to sleep for.
                    Ответить
                  • Кстать надо попробовать стандартный рид
                    Ответить
            • Не знаю, почему их назвали threads, но это никакие не потоки, а простые корутины, вызывающая программа будет ждать, пока корутина не вернёт значение через coroutine.yield. Напишешь корутину с ьесконечным циклом без yield'ы внутри и программа зависнет.
              Ответить
              • показать все, что скрытоvanished
                Ответить
                • Корутины - фундамент, на основе которого можно замутить гринтреды. Так устроит?
                  Ответить
                  • показать все, что скрытоvanished
                    Ответить
                    • > многозадачность (на основе таймера) которая позволяет программисту НЕ думать о том, что он делит с кем-то проц
                      Это хорошо, если задачи изолированы. А если нет, то многозадачность заставляет думать о всяком говне вроде критических секций и синхронизации. Асинхронная малозадачность позволяет программисту НЕ думать о взаимодействии между потоками.

                      Оба пути полезны. Надо использовать многозадачность и малозадачность в тех случаях, где они действительно нужны. Например, в программе с графическим интерфейсом основная логика будет построена на малозадачности, чтобы не думать о синхронизации и т.п., а для тяжёлых изолированных задач, запускаемых по кнопке - использовать многозадачность.
                      Ответить
                      • В "малозадачности" один хер надо думать о других "потоках". Просто выглядит всё это интуитивнее.
                        Ответить
                    • >> давайте еще виртуальную память отменим и будем вручную свапаться

                      Я ещё за то, чтобы отменить защиту памяти, тогда можно будет срать по произвольному адресу, как в «DOS».

                      Давайте любой код исполнять в нулевом кольце, чтобы сразу с обращением к I/O из юзерского кода.
                      Ответить
                      • Напиши драйвер, который отменяет защиту.
                        Ответить
                  • Хуёвые гринтреды. Есть, конечно, имплементации гринтредов с неявной елдой внутри alloc, но это низкий сорт, нечистая работа.
                    Ответить
                    • > елдой внутри аллок
                      Решили объединить худшие стороны кооперативной и вытесняющей многозадачности?
                      Ответить
      • Корутина не поток, в лав2д есть норм потоки
        Ответить
        • co = coroutine.create(function ()
                     print("hi")
                   end)
              
              print(co)   --> thread: 0x8071d98

          Не я это придумал. Сопрограммы в луа меют тип "поток"
          Ответить
    • показать все, что скрытоvanished
      Ответить
    • Ответить
    • Какой багор )))
      Ответить
    • показать все, что скрытоvanished
      Ответить

    Добавить комментарий