Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Клуб программистов > Свободное общение
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.10.2013, 14:22   #1
the_deer_one
Участник клуба
 
Аватар для the_deer_one
 
Регистрация: 04.04.2010
Сообщений: 1,554
По умолчанию шо цэ короутины такоэ

Что такое короутины? Периодически встречается в обсуждениях, и непонятно в каком смысле оно употребляется, то ли синоним процедур, то ли какие-то хитрые функции с восстановлением состояния, то ли что то с многопоточностью связано.
the_deer_one вне форума Ответить с цитированием
Старый 18.10.2013, 14:32   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

http://ru.wikipedia.org/wiki/Сопрограмма?
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 18.10.2013 в 14:35.
BDA на форуме Ответить с цитированием
Старый 18.10.2013, 14:40   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
короутины
Coroutine
Теперь процедуры так и буду называть ))))
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 18.10.2013, 14:41   #4
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Бейсиковский Gosub/return на новый лад. Поскольку прямые переходы не тру теперь будут рожать костыли и говорить что это круто.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 18.10.2013, 14:47   #5
the_deer_one
Участник клуба
 
Аватар для the_deer_one
 
Регистрация: 04.04.2010
Сообщений: 1,554
По умолчанию

вот пример например
http://blog.asymptotic.co.uk/2009/11...nes-in-csharp/
И зачем возвращать итератор между каждой итерацией алгоритма? Если нужно останавить алгоритм, обычный bool флаг же будет лучше. И где там эти короутины?
the_deer_one вне форума Ответить с цитированием
Старый 18.10.2013, 15:05   #6
MihalNik
МегаМодератор
СуперМодератор
 
Регистрация: 27.11.2012
Сообщений: 5,657
По умолчанию

Мне одному описание напоминает абстрактный кусок сферического кода в вакууме?
Благими намерениями устлана дорога на programmersforum.ru
MihalNik вне форума Ответить с цитированием
Старый 18.10.2013, 15:05   #7
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
И зачем возвращать итератор между каждой итерацией алгоритма?
Потому что нет понимания алгоритма. Любой алгоритм можно разложить структурно. Если алгоритм укладывается в машину Тьюринга значит он может быть реализован с помощью обычных блоков, циклов и условий. Все остальное от беса.
Я понимаю в какой-нибудь функциональщине иные законы природы и там это может и не изврат, но в классическом императивном стиле это просто финт.
Цитата:
Мне одному описание напоминает абстрактный кусок сферического кода в вакууме?
Я вообще не встретил ни одного реального примера из жизни. И это опять же как бы намекает нам, что это из функционального стиля.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 18.10.2013, 15:11   #8
MihalNik
МегаМодератор
СуперМодератор
 
Регистрация: 27.11.2012
Сообщений: 5,657
По умолчанию

Цитата:
Подпрограмма может возвращаться только однажды, сопрограмма может возвращать управление несколько раз.
Похоже кто-то не осилил стуктурное погромирование. А вот если второй раз вызвать - не вернется?

Цитата:
Время работы подпрограммы определяется принципом LIFO (последняя вызванная подпрограмма завершается первой), время работы сопрограммы определяется её использованием и необходимостью.
Похоже на вандализм в википедии

Суть понял так:
Код:
Сопрог1:
а
Сопрог2
в
Сопрог2
д
Сопрог2
ж
энд Сопрог1;

Сопрог2:
б
Сопрог1
г
Сопрог1
е
Сопрог1
энд Сопрог2;
Вот, например, вместо 2-х реализаций 3-х виртуальных б, г и е (итого 6 методов и 2 класса) пара плетенок типа Сопрог2 это неплохо.
Благими намерениями устлана дорога на programmersforum.ru

Последний раз редактировалось MihalNik; 18.10.2013 в 15:55.
MihalNik вне форума Ответить с цитированием
Старый 18.10.2013, 18:23   #9
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Цитата:
Я вообще не встретил ни одного реального примера из жизни. И это опять же как бы намекает нам, что это из функционального стиля.
EVE Online, там весь бэкэнд построен на Stackless Python c этими-самыми короутинами: нужно асинхронно обрабатывать тучу одновременно поступающих запросов, подзадачи зависят от других подзадач, но не могут ждать их выполнения, подзадач слишком много, чтобы использовать события. Gevent, Concurrence опять же (и что там ещё основано на greenlets), короче, асинхронные фреймворки всякие.



Некоторое подобие на питонячих генераторах: функции начинают выполнение/возвращают результат в разных местах в зависимости от данных на входе и предыдущей точке выхода.
Код:
def coroutine(f):
    def start(*args, **kwargs):
        g = f(*args, **kwargs)
        g.next()
        return g
    return start    

@coroutine
def stream_parser(handlers):
    while True:
        symbol = (yield)
        body = ''
        if symbol == '[':
            while True:
                symbol = (yield)
                if symbol == ']':
                    for handler in handlers:
                        handler.send(body)
                    break
                else:
                    body += symbol

@coroutine
def _printer():
    while True:
        body = (yield)
        print body

@coroutine
def _foo_catcher():
    while True:
        body = (yield)
        if body == 'FOO':
            print 'YAY, GOT FOO!'

@coroutine
def _collector(max_count):
    try:
        while True:        
            body = (yield)        
            buf = []     

            while len(buf) < max_count:            
                buf.append(body)
                body = (yield)  

            print 'Collected %d: %s' % (max_count, ', '.join(buf))
    finally:
        print 'Rest in collector: %s' % ', '.join(buf)


parser = stream_parser(handlers=[_printer(), _foo_catcher(), _collector(max_count=3)])

for x in "hello this is some [HELLO] stream [TAG_1] with some [FOO] tags [TAG_2] lalala [TAG_3] ok":
    parser.send(x)
Цитата:
HELLO
TAG_1
FOO
YAY, GOT FOO!
TAG_2
Collected 3: HELLO, TAG_1, FOO
TAG_3
Rest in collector: TAG_3
пыщь

Последний раз редактировалось JTG; 18.10.2013 в 18:31.
JTG вне форума Ответить с цитированием
Старый 18.10.2013, 19:58   #10
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
Stackless Python c этими-самыми короутинами: нужно асинхронно обрабатывать тучу одновременно поступающих запросов, подзадачи зависят от других подзадач, но не могут ждать их выполнения,
То есть это раскладывается на ядра процессора?
Все равно это превращение кода в спаггети. Если счас контекст программы дерево, то предлагается граф в результате разрыв мозга при командной работе - та самая причина по которой материли goto.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика

Последний раз редактировалось Utkin; 18.10.2013 в 20:01.
Utkin вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц