Сегодня, совершенно неожиданно для себя, открыл 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