Coroutines
От: DemAS http://demas.me
Дата: 24.02.09 11:58
Оценка: 5 (1)
Сегодня, совершенно неожиданно для себя, открыл Coroutines.
Пример их использования, который я нашел:

import multitask
import time

def c1():
    for i in range(3):
       print 'c1'
       yield i

def c2():
    for i in range(3):
       print 'c2'
       yield i

multitask.add(c1())
multitask.add(c2())
multitask.run()


Но данный пример показывает использование coroutines в многопоточной
программе, хотя в интернете я находил утверждения, что они могут быть
полезны и в однопоточных программах.

Собственно, два вопроса:

1. Буду благодарен за пример проблемы, в решении которой coroutines не
притянуты за уши.

Я нашел вот это: http://c2.com/cgi/wiki?OddWordProblem
И решение: http://c2.com/cgi/wiki?OddWordProblemSolutions.

В решении на C# coroutines я вообще не увидел

        using System;
    using System.IO;
    using System.Collections;


    public class OddWordProblem {
    [STAThread]
    static void Main(string[] args) {
        StreamWriter output = new StreamWriter(args[1]);
        new OddWordProblem().Solve(new StreamReader(args[0]), output);
        output.Flush();
    }


    ArrayList currentWord = new ArrayList();
    char aSeparator;
    bool isForward=true;
    bool isWordEnded=false;


    void Solve(StreamReader theInput, StreamWriter theOutput) {
        int nextChar;
        while ((nextChar = theInput.Read())!=-1) {
        char aChar = (char)nextChar;
        if(aChar==' '||aChar=='.')EndOfWord(theOutput, aChar);
        else MiddleOfWord(theOutput, aChar);
        }
        theOutput.Write(aSeparator);
    }
    void MiddleOfWord(StreamWriter theOutput, char aChar) {
        if(isWordEnded) {
        isWordEnded = false;
        isForward = !isForward;
        theOutput.Write(aSeparator);
        }
        currentWord.Add(aChar);
    }
    void EndOfWord(StreamWriter output, char nextChar) {
        if(!isForward)currentWord.Reverse();
        foreach(char aChar in currentWord)
        output.Write(aChar);
        aSeparator = nextChar;
        currentWord = new ArrayList();
        isWordEnded = true;
    }
    }


Мы всего лишь засунули символы в буфер и вызвали метод .Reverse(). Или я
чего то не понимаю?

2. Вопрос по реализации. Если я правильно понимаю, между вызовами coroutine
ее состояние(локальные переменные и точка возврата) должна где-то
сохраняться. Где она сохраняется? Неужели в стеке?
Posted via RSDN NNTP Server 2.1 beta
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.