1. Python / Говнокод #21460

    −22

    1. 1
    Чо там напитоне

    А давайте-ка обсудим новые фичи питона.

    Запостил: 3_14dar, 16 Октября 2016

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

    • показать все, что скрытоhttps://docs.python.org/3.5/whatsnew/3.5.html

      К сожалению, на ideone 3.4, а 3.5 на свинье не идет.
      Ответить
    • показать все, что скрытоЯ щитаю, что async/await и тайпхинты не нужны.
      Ответить
      • показать все, что скрытоИ вообще мне второй питон нравится.
        Ответить
      • показать все, что скрытоasync/await нужны там где нужна корпоративная многозадачность (в питоне это в первую очередь веб).
        Ответить
        • показать все, что скрытоТам, где нужна кооперативная многозадачность, нужны нормальные зеленые потоки, а не это говно из сишарпа.
          Ответить
          • показать все, что скрытоНу расскажи мне в чем разница.

            К твоему сведению, в питоне появился только синтаксис, а те же самые фичи без сахарка были уже давно. tornado, twisted и т.д.
            Ответить
            • показать все, что скрытоВ реализации разница в том, что async-await - это сахарок для написания конечного автомата, а зеленые потоки ака стекфул корутины - полноценные потоки выполнения со своим стеком.
              Практически значимая разница в том, что для зеленых потоков не нужен специальный синтаксис, т.е. не нужно расставлять по коду эти async и await.
              Ответить
              • показать все, что скрытоМням, а в async-await своего стека в каждом "потоке" нету что ли? Пример когда зеленых потоков в студию.
                Ответить
                • показать все, что скрытоЯ не знаю, как в питоне под капотом сделано) Но если есть async/await, то стека видимо нет.

                  Вот код на async/await:
                  async def a():
                      return await socket.read()
                  
                  async def b():
                      x = await a() # нужно беспонтово писать await
                      return x * 2


                  Вот на гипотетических стекфул корутинах:
                  def a():
                      return socket.read() # под капотом переключает контекст, отдавая управление планироващику
                  
                  def b():
                      x = a() # не нужно писать await
                      return x * 2


                  В первом случае у корутин нет своего стека, они работают на стеке планировщика. Каждый раз, когда корутина отдает управление планировщику, она разматывает стек (по сути делает return), а состояние сохраняет где-то в другом месте.
                  async/await в этом случае - синтаксический сахарок для двух вещей:
                  1) При вызове функции перейти туда, где закончили в прошлый раз.
                  2) При await запомнить, на какой команде находится корутина, и сделать return.
                  При этом корутине b() приходится делать return, когда a() это делает. Отсюда необходимость беспонтово писать await.
                  Это я описал, как работает async/await в сисярпе. Как я уже сказал, я не знаю, как оно в питоне.

                  Во втором случае у каждой корутины свой стек. Когда корутине надо заснуть, она каким-то образом переключает контекст, отдавая управление планировщику (т.е. заменяет текущий стек, номер инструкции и прочие регистры на стек, номер инструкции и регистры планировщика). При этом функция b() даже не знает, что функция a() может отдавать управление. Когда планировщик решит, что корутину пора разбудить, он переключит контекст обратно. Таким образом для переключение корутины не нужно разматывать стек, и следовательно не нужно писать никакие await в b().
                  Ответить
                  • показать все, что скрыто>В первом случае у корутин нет своего стека, они работают на стеке планировщика. Каждый раз, когда корутина отдает управление планировщику, она разматывает стек (по сути делает return), а состояние сохраняет где-то в другом месте.
                    И в чем проблема?

                    Я так понимаю все блокирующие функции вроде socket.read() должны быть заменены на специальные другие, что автоматически делает невозможным использование библиотек?
                    Ответить
                    • показать все, что скрыто> И в чем проблема?
                      В том, что нужно писать async/await.

                      > Я так понимаю все блокирующие функции вроде socket.read() должны быть заменены на специальные другие, что автоматически делает невозможным использование библиотек?
                      Ну да, без этого никак. Ну хотя в питоне наверное можно и захачить, подменив класс socket в модуле socket))

                      Зато если у тебя есть условная функция socks5_handshake(socket, ...), работающая с обычными блокирующими сокетами, то она сможет работать и в зеленом потоке, если подсунуть в нее специальный сокет. А вот с async/await такую функцию не подружить.
                      Ответить
                      • показать все, что скрыто>> И в чем проблема?
                        >В том, что нужно писать async/await.

                        >Ну да, без этого никак.
                        Таки async/await по сравнению с этим куда меньшая проблема.

                        >А вот с async/await такую функцию не подружить.
                        С хуле это блокирующую функцию нельзя подружить с async?
                        Ответить
                      • показать все, что скрытоhttp://stackabuse.com/python-async-await-tutorial/ если верить этому, то async def можно заменить декоратором. Там есть и примеры как из асинхронных функций дергать блокирующий код.
                        Ответить
          • показать все, что скрыто> из сишарпа
            и жс
            Ответить
        • показать все, что скрытов каких именно случаях это нужно для веб?
          Ответить

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