Метатабличный / Говнокод #24660 Ссылка на оригинал

0

  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 3oJIoTou_xyu, (Updated )

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

  • Видимо, ты не правильно написал код на "Lua".
    Ответить
      • Загуглить что корутина не тред и не может выполняться в фоне? Ну я это и так знаю.
        Ответить
        • 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'ы внутри и программа зависнет.
            Ответить
            • да у них тыща имен
              некоторые со словом тредс: грин тредс, например

              Броманд зря доебался: многозодачность бывает копротивная и вытесняющая
              копропротивная это как раз когда надо делать елду вручную
              Ответить
              • Корутины - фундамент, на основе которого можно замутить гринтреды. Так устроит?
                Ответить
                • У меня кстати есть ощущение что весь этот нынешний модный базз про корутины и асинки и эвенки это какой-то адский даунгрейд

                  Уже довольно давно придумали вытесняюущую многозадачность (на основе таймера) которая позволяет программисту НЕ думать о том, что он делит с кем-то проц

                  ну окей, надо думать про синхронизацию (а у коо было не надо) но не надо везде пихать этот сраный await

                  И тут вдруг все начали писать с коопертивной многозадачностью и писать везде await и страшно радуются

                  чему радуетесь, дебилы?
                  давайте еще виртуальную память отменим и будем вручную свапаться
                  Ответить
                  • > многозадачность (на основе таймера) которая позволяет программисту НЕ думать о том, что он делит с кем-то проц
                    Это хорошо, если задачи изолированы. А если нет, то многозадачность заставляет думать о всяком говне вроде критических секций и синхронизации. Асинхронная малозадачность позволяет программисту НЕ думать о взаимодействии между потоками.

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

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

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

        Не я это придумал. Сопрограммы в луа меют тип "поток"
        Ответить
  • почитай что-ли про кооперативную многопоточность, и чем она от вытесняющей отличаеца
    Ответить

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

Помни, guest, за тобой могут следить!

    А не использовать ли нам bbcode?


    8