170 похожих чатов

Добрый вечер. Кто-нибудь пытался на новых корутинах повторить питоновые генераторы?

co_yield я ещё как-то освоил, интересует возможность илдить что-то с аргументом, полученным через co_await.
иными словами - повторить вот этот питоновый код:
>>> def double_inputs():
... while True:
... x = yield
... yield x * 2
...
>>> gen = double_inputs()
>>> next(gen) # run up to the first yield
>>> gen.send(10) # goes into 'x' variable
20

21 ответов

12 просмотров

https://github.com/lewissbaker/cppcoro

0xBytearray- Автор вопроса
Danya🔥
https://github.com/lewissbaker/cppcoro

видел, но там в async_generator<T> не вполне понятно как что-то слать. показан пример с ожиданием таймера, но это не "принятие аргумента". это потом никак в co_yield не использовать. надо бы что-то вида int i = co_await something; co_yield object(i)

0xBytearray
видел, но там в async_generator<T> не вполне понят...

В примере с питона у тебя нет авэйта

0xBytearray- Автор вопроса
0xBytearray- Автор вопроса
Kirill Bolshakov
Ну, это co_yield

co_yield это на выход из генератора. мне нужен вход

0xBytearray- Автор вопроса
Kirill Bolshakov
Вход в генерато это вызов функции

вот нужна возможность что-то периодически передавать в один и тот же генератор. через awaitable, я так понял

0xBytearray
co_yield это на выход из генератора. мне нужен вхо...

На сколько я понимаю в такой задаче входом будет другой генератор. Для него нужно будет реализовать "концепт" awaitable (на самом деле такого концепта нет, но мне удобнее это так называть). С ходу я не скажу, может в cppcoro генератор уже реализует awaitable и тогда можно все готовое использовать.

0xBytearray- Автор вопроса
magras
На сколько я понимаю в такой задаче входом будет д...

я не против awaitable, знать бы только как из него достать какую-либо передаваемую в генератор переменную

0xBytearray
я не против awaitable, знать бы только как из него...

Очень приблизительно так: class Source { struct promise_type { int value; int yield_value() { return value; } ... }; coroutine_handle m_coro; public: void push(int v) { m_coro.promise().value = v; } }; Скорее всего для того чтобы реализовать awaitable понадобится еще continuation хранить в promise. upd: Код принципиально неправильный и сама идея реализовывать здесь корутину не верна.

magras
Очень приблизительно так: class Source { struct ...

Хотя я туплю. Кажется здесь сама корутина не нужна. Можно просто awaitable реализовать.

magras
Хотя я туплю. Кажется здесь сама корутина не нужна...

Кажется здесь уже без экзекютера не обойтись. Если я правильно понимаю, такой источник данных должен при suspend'е должен сохранить continuation. В методе push он долен зашедулить исполнение в экзекютере. В простейшем случае думаю можно просто продолжить исполнение на текущем трэде. В общем я попробую набросать рабочий пример.

magras
Очень приблизительно так: class Source { struct ...

yield_value разве можно без аргументов? (ну и соответственно co_yield без expression?)

PRoSToC0der
yield_value разве можно без аргументов? (ну и соот...

Действительно нельзя. Да и возвращать yield_value() должен awaitable. Сейчас добавлю апдейт, что этот код - бред.

0xBytearray- Автор вопроса

Проблема решилась на stack overflow, спасибо доброму человеку https://gcc.godbolt.org/z/8aMjej

кажется у тебя баг в питонокоде

0xBytearray- Автор вопроса
0xBytearray
Проблема решилась на stack overflow, спасибо добро...

эх. Не успел. =( Единственное что я бы хранил значение снаружи в generator_input и передавал бы ссылку на него в лямбду при конструировании. Но это мелочи если считать это просто демострационным кодом.

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта