- 1
Чо там напитоне
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
−22
Чо там напитоне
А давайте-ка обсудим новые фичи питона.
3_14dar 16.10.2016 04:13 # −16
К сожалению, на ideone 3.4, а 3.5 на свинье не идет.
passiv 16.10.2016 07:28 # −70
huesto 16.10.2016 17:17 # −20
huesto 16.10.2016 17:18 # −20
3_14dar 16.10.2016 18:53 # −20
huesto 16.10.2016 19:10 # −20
3_14dar 16.10.2016 21:45 # −20
К твоему сведению, в питоне появился только синтаксис, а те же самые фичи без сахарка были уже давно. tornado, twisted и т.д.
huesto 16.10.2016 22:46 # −20
Практически значимая разница в том, что для зеленых потоков не нужен специальный синтаксис, т.е. не нужно расставлять по коду эти async и await.
3_14dar 17.10.2016 00:43 # −23
huesto 17.10.2016 01:50 # −22
Вот код на async/await:
Вот на гипотетических стекфул корутинах:
В первом случае у корутин нет своего стека, они работают на стеке планировщика. Каждый раз, когда корутина отдает управление планировщику, она разматывает стек (по сути делает return), а состояние сохраняет где-то в другом месте.
async/await в этом случае - синтаксический сахарок для двух вещей:
1) При вызове функции перейти туда, где закончили в прошлый раз.
2) При await запомнить, на какой команде находится корутина, и сделать return.
При этом корутине b() приходится делать return, когда a() это делает. Отсюда необходимость беспонтово писать await.
Это я описал, как работает async/await в сисярпе. Как я уже сказал, я не знаю, как оно в питоне.
Во втором случае у каждой корутины свой стек. Когда корутине надо заснуть, она каким-то образом переключает контекст, отдавая управление планировщику (т.е. заменяет текущий стек, номер инструкции и прочие регистры на стек, номер инструкции и регистры планировщика). При этом функция b() даже не знает, что функция a() может отдавать управление. Когда планировщик решит, что корутину пора разбудить, он переключит контекст обратно. Таким образом для переключение корутины не нужно разматывать стек, и следовательно не нужно писать никакие await в b().
3_14dar 17.10.2016 02:44 # −21
И в чем проблема?
Я так понимаю все блокирующие функции вроде socket.read() должны быть заменены на специальные другие, что автоматически делает невозможным использование библиотек?
huesto 17.10.2016 03:05 # −22
В том, что нужно писать async/await.
> Я так понимаю все блокирующие функции вроде socket.read() должны быть заменены на специальные другие, что автоматически делает невозможным использование библиотек?
Ну да, без этого никак. Ну хотя в питоне наверное можно и захачить, подменив класс socket в модуле socket))
Зато если у тебя есть условная функция socks5_handshake(socket, ...), работающая с обычными блокирующими сокетами, то она сможет работать и в зеленом потоке, если подсунуть в нее специальный сокет. А вот с async/await такую функцию не подружить.
3_14dar 17.10.2016 05:04 # −22
>В том, что нужно писать async/await.
>Ну да, без этого никак.
Таки async/await по сравнению с этим куда меньшая проблема.
>А вот с async/await такую функцию не подружить.
С хуле это блокирующую функцию нельзя подружить с async?
3_14dar 17.10.2016 07:12 # −23
passiv 17.10.2016 08:06 # −86
guestinho 16.10.2016 21:55 # −20
и жс
huesto 16.10.2016 23:40 # −21
guestinho 16.10.2016 21:57 # −20
passiv 16.10.2016 22:29 # −84
3_14dar 16.10.2016 22:38 # −20
gostinho 23.03.2017 22:47 # −14
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.
нихуя он это не пофиксил