- 1
Чо там напитоне
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
−22
Чо там напитоне
А давайте-ка обсудим новые фичи питона.
К сожалению, на ideone 3.4, а 3.5 на свинье не идет.
К твоему сведению, в питоне появился только синтаксис, а те же самые фичи без сахарка были уже давно. tornado, twisted и т.д.
Практически значимая разница в том, что для зеленых потоков не нужен специальный синтаксис, т.е. не нужно расставлять по коду эти async и await.
Вот код на async/await:
Вот на гипотетических стекфул корутинах:
В первом случае у корутин нет своего стека, они работают на стеке планировщика. Каждый раз, когда корутина отдает управление планировщику, она разматывает стек (по сути делает return), а состояние сохраняет где-то в другом месте.
async/await в этом случае - синтаксический сахарок для двух вещей:
1) При вызове функции перейти туда, где закончили в прошлый раз.
2) При await запомнить, на какой команде находится корутина, и сделать return.
При этом корутине b() приходится делать return, когда a() это делает. Отсюда необходимость беспонтово писать await.
Это я описал, как работает async/await в сисярпе. Как я уже сказал, я не знаю, как оно в питоне.
Во втором случае у каждой корутины свой стек. Когда корутине надо заснуть, она каким-то образом переключает контекст, отдавая управление планировщику (т.е. заменяет текущий стек, номер инструкции и прочие регистры на стек, номер инструкции и регистры планировщика). При этом функция b() даже не знает, что функция a() может отдавать управление. Когда планировщик решит, что корутину пора разбудить, он переключит контекст обратно. Таким образом для переключение корутины не нужно разматывать стек, и следовательно не нужно писать никакие await в b().
И в чем проблема?
Я так понимаю все блокирующие функции вроде socket.read() должны быть заменены на специальные другие, что автоматически делает невозможным использование библиотек?
В том, что нужно писать async/await.
> Я так понимаю все блокирующие функции вроде socket.read() должны быть заменены на специальные другие, что автоматически делает невозможным использование библиотек?
Ну да, без этого никак. Ну хотя в питоне наверное можно и захачить, подменив класс socket в модуле socket))
Зато если у тебя есть условная функция socks5_handshake(socket, ...), работающая с обычными блокирующими сокетами, то она сможет работать и в зеленом потоке, если подсунуть в нее специальный сокет. А вот с async/await такую функцию не подружить.
>В том, что нужно писать async/await.
>Ну да, без этого никак.
Таки async/await по сравнению с этим куда меньшая проблема.
>А вот с async/await такую функцию не подружить.
С хуле это блокирующую функцию нельзя подружить с async?
и жс
Invalid address: [email protected]_You must provide at least one recipient email address. Invalid address: [email protected]_You must provide at least one recipient email address.
нихуя он это не пофиксил