@ru_python

Страница 2432 из 9768
Nikolay
07.03.2017
08:20:16
у тебя же на каждый такой вызов создастся фрейм

Rocket
07.03.2017
08:20:34
Ннннееее

он же себя вызывает только если при обработке конкретного реквеста прошлый итератор закончился

после обработки этого запроса он выходит назад в send_request

Google
Rocket
07.03.2017
08:21:26
там глубина не больше двух

Nikolay
07.03.2017
08:22:04
Rocket
07.03.2017
08:22:16
все верно, отрабатывает его и выходит

Nikolay
07.03.2017
08:22:18
и стек-то не реюзается, у тебя останется ссылка на родительский фрейм

на каждом вызове

не веришь - попробуй дерни код 3000 раз

упадет или нет?

Rocket
07.03.2017
08:22:50
уже 10 тыщ раз попробовал

он же выходит после обработки реквеста

Alexandr Korotaev
07.03.2017
08:23:23
народ, почему код: import os os.system("cat /path/to/file/file.txt|pbcopy") засовывает в буфер обмена в формате ascii??? файл utf-8... (macos & jupyter & python 2.7)

Rocket
07.03.2017
08:23:45
диспетчер завершает выполнение после отправки реквеста тем или иным способом

Nikolay
07.03.2017
08:24:06
Rocket
07.03.2017
08:24:17
да он его обработал и вышел

Google
Nikolay
07.03.2017
08:24:21
у тебя фрейм остается висеть, чтобы интерпретатор знал, куда вернуть управление

Rocket
07.03.2017
08:24:34
так оно ж возвращатеся

сразу, условие идет по первой ветке, потому что ctx == None

Nikolay
07.03.2017
08:24:51
так фрейм-то из памяти не собирается при этом gc

он остается висеть

Rocket
07.03.2017
08:25:18
да с чего бы вдруг то?

Nikolay
07.03.2017
08:25:19
условие по первой ветке идет один раз

Rocket
07.03.2017
08:25:24
ок, ща 100 тыщ запущу )

Nikolay
07.03.2017
08:25:27
да с чего бы вдруг то?
с того, что рекурсия так работает? :)

проверь recursionlimit на твоей системе

Rocket
07.03.2017
08:25:38
он из неё выходит на втором шаге

Nikolay
07.03.2017
08:26:03
он из неё выходит на втором шаге
не выходит он, он делает рекурсивный вызов

у тебя остается в памяти висеть ненужная цепочка фреймов как минимум

Rocket
07.03.2017
08:26:21
короче, ты не прав, я уже 10 лямов запустил - все ок )

Nikolay
07.03.2017
08:26:29
а как максимум - стековерфлоу

Rocket
07.03.2017
08:26:49
10 лямов - ок

Nikolay
07.03.2017
08:26:55
не, я точно прав, просто, видимо, в случае генераторов оно чуть по-другому работает

проверь потребление памяти

растет ли оно

Rocket
07.03.2017
08:27:58
неа

Google
Rocket
07.03.2017
08:28:34
запустил цикл в 100 миллионов

смотрю на память - ничего не меняется

процессор, естественно, 100%

Nikolay
07.03.2017
08:30:22
странно

надо будет понять, где там оптимизация происходит

а, стоп, я понял

ты же присваиваешь ctx None

все

тогда да, неявность пропадает

Rocket
07.03.2017
08:32:03
первый вызов: send_request -> dispatcher -> handler() -> asend(None) второй вызов: send_request -> dispatcher -> asend(data) последний вызов: send_request - dispatcher - dispatcher - handler() - asend(None)

Nikolay
07.03.2017
08:32:04
сразу не вкурил :)

да, все ок

Nikolay
07.03.2017
08:32:30
но это магия адская, конечно

Rocket
07.03.2017
08:33:22
да нет, не магия, нормальная логкика: если генератор закончился - обработать запрос еще раз, но уже станадртным путём

100 миллионов отработали нормально

Nikolay
07.03.2017
08:36:05
ну, так-то да

но вообще код понять сложно поначалу)

Rocket
07.03.2017
08:36:27
магия там будет, когда я замучу это все в реальном диспетчере запросов. Там фильтры зарпосов всякие итд...

Nikolay
07.03.2017
08:36:42
а откуда магическая константа 10?

Rocket
07.03.2017
08:36:59
из головы )

Google
Rocket
07.03.2017
08:37:15
выполняю 10 запросов, я ж тестик написал, это не реальный код

Nikolay
07.03.2017
08:37:31
не, просто какой в ней смысл? у тебя диспетчеры последовательно же создаются, а не асинхронно

а, это тест? понял

Rocket
07.03.2017
08:38:03
диспетчер один, он роутит запросы по хендлерам в зависимости от фильтров

сейчас не так, но так задумано в будущем

и вот теперь интересный вопрос...

Nikolay
07.03.2017
08:38:46
в конкретный момент времени он один, да

а зачем тебе слипы в хэндлере?

Rocket
07.03.2017
08:39:45
чтобы видеть глазами как оно работает

Nikolay
07.03.2017
08:39:51
ээ) ну окей

Admin
ERROR: S client not available

Rocket
07.03.2017
08:40:07
я ж так еще не делал никогда, вот 3.6 попробовал только что

так вот, вопрос следующий... как мне теперь отличать обычную корутину от асинхронного генератора?

обрабатывать то их надо совершенно по разному...

Nikolay
07.03.2017
08:41:37


ты сейчас примерно так себя чувствуешь?

Rocket
07.03.2017
08:41:49
да да да да )))

Rocket
07.03.2017
08:42:34
ты сейчас примерно так себя чувствуешь?
Ну, нет, я уже давно научился, что бросаться сразу править рабочую библиотку под новый функционал не нужно... потому что "работает - не трогай" - идея должна "отлежаться" ну и все такое

Google
Rocket
07.03.2017
08:42:51
я асинхронному генератору не могу сделать await

Nikolay
07.03.2017
08:43:25
хм, там специальный вид эксепшена для этого?

мол, нельзя от двух вещей ждать - от бабы и от генератора?

Rocket
07.03.2017
08:44:12
обычный хендлер я вызываю так: await handler(data) а вот асинхронный генератор надо вызывать так: первый раз: gen = handler(data) await gen.asend(None) и в дальнейшем так: await gen.asend(data)

Nikolay
07.03.2017
08:44:29
да я понял

то есть проматывать его извне

красота

но по нему же наверняка можно async for?

если yield не принимают значения?

Rocket
07.03.2017
08:45:31
конечно можно!

но это ж не мой случай, у меня задача другая

диспетчер то не знает что ему сейчас надо вызывать - если генератор, то надо из него итератор получить и сохранить его в контекст, чтобы при следующем запросе его обработать по особому

print(type(handler)) print(type(dispatcher)) <class 'function'> <class 'function'>

и для корутины и для генератора

что логично, ибо....

Nikolay
07.03.2017
08:47:50
ибо генератор и корутина - это функции)

Ilia
07.03.2017
08:47:50
inspect.isasyncgen(), inspect.isasyncgenfunction()

Nikolay
07.03.2017
08:48:02
inspect.isasyncgen(), inspect.isasyncgenfunction()
два чаю этому господину

но это будет адский код

Rocket
07.03.2017
08:48:41
. h = handler(0) d = dispatcher(0) print(type(h)) print(type(d)) <class 'async_generator'> <class 'coroutine'>

вот и решение )

Ilia
07.03.2017
08:49:53
А зачем так делать то, легаси какое-то?

Rocket
07.03.2017
08:52:25
А зачем так делать то, легаси какое-то?
У меня такая задумка старая есть - я хочу не покидая функцию обрабатывать несколько последовательных запросов, не теряя контекст. В реальности так: есть бот, у него есть wizard: пришли картинку, пришли название, пришли локацию. Сейчас это три отдельных хендлера, между которыми я передаю общий стейт, в конце каждого шага делаю ctx.set_next_handler(), а хочется заменить это одной функцией-генератором.

Страница 2432 из 9768