Спасибо, реально разыгрался аппетит :) пошел тырить печеньки у товарищей :)
On Jun 5, 2014, at 5:14 PM, Alexander Lourier <[email protected]> wrote: > Запилил за 10 минут. Такие задачки на Go решаются элементарно. А если учесть, > что каждая горутина может выполняться на своём CPU и никаких GIL, то > становится ням-ням как вкусно. > > > 5 июня 2014 г., 15:10 пользователь Eugene Toropov <[email protected]> > написал: > Интересно, это уже готовое было или запилил за полчаса? > > Евгений > > On Jun 5, 2014, at 5:03 PM, Alexander Lourier <[email protected]> wrote: > >> Минутка рекламы. Вот решение задачи на Go. Оно длинное, потому что я его >> обильно снабдил комментариями. Если лишнее убрать, всё будет выглядеть очень >> компактно и работать производительно. >> >> package main >> >> import ( >> "fmt" >> "math/rand" >> "time" >> ) >> >> const ( >> numWorkers = 10 >> ) >> >> // task - это задание для воркера. >> type task struct { >> value int >> output chan result >> } >> >> // result - это результат обработки задания воркером. >> type result struct { >> value int >> worker int >> } >> >> // worker берёт данные из канала input, обрабатывает их (умножает на 100) и >> кладёт в канал ответа, >> // который прислан вместе с заданием. >> func worker(workerNumber int, input chan task) { >> // Пока входной канал не закроют, читаем из него задание. >> for task := range input { >> // Работаем в поте лица. >> time.Sleep(time.Duration(rand.Intn(100)) * time.Millisecond) >> task.output <- result{task.value * 100, workerNumber} >> } >> } >> >> // prepareInput готовит входные задания и кладёт их в два канала: в одну >> очередь >> // задания для воркеров, в другую - каналы ответа. >> func prepareInput(input chan task, output chan chan result) { >> for i := 0; i < 100; i++ { >> // Канал ответа буферизованный, чтобы воркер не ждал, когда его >> ответ считают, >> // а сразу брался за следующее задание. >> outputChan := make(chan result, 1) >> // Тот факт, что задания кладутся в input и output в одном и >> том же порядке, >> // гарантирует, что ответы будут упорядочены в том же порядке. >> input <- task{i, outputChan} >> output <- outputChan >> } >> close(input) >> close(output) >> } >> >> func main() { >> // Каналы обязательно буферизованные (длина буфера = числу воркеров). >> input := make(chan task, numWorkers) >> output := make(chan chan result, numWorkers) >> >> // Запускаем готовилку входных данных. >> go prepareInput(input, output) >> >> // Запускаем воркеры. >> for i := 0; i < numWorkers; i++ { >> go worker(i, input) >> } >> >> // Читаем ответы в порядке, в каком нам нужно. >> for res := range output { >> fmt.Printf("%+v\n", <-res) >> } >> } >> >> >> 5 июня 2014 г., 13:46 пользователь Харпалёв Иван <[email protected]> >> написал: >> Добрый день, могучий MoscowPM >> >> Опять про параллельную обработку. >> >> Хочется написать вот такую схему обработки ввода: >> master создаёт work'ов, >> читает порции из файла, раздаёт порции worker'ам >> ждёт, пока worker обработает, получает ответ worker'a >> пишет результат в файл. >> Так же мастер буфереизует вывод, чтобы выход писался в правильном порядке. >> >> Самое туманное: >> Как передавать данные от мастера к worker'у и Обратно?!!!! >> Как ждать готовности?!!! >> Должна ли такая схема (работа с диском из одного места) дать ускорение по >> сравнению с чтением/записью файла в каждом worker'е? >> >> смотрел на Coro, увидел Coro::Simaphore, Coro::Signal ... но не пойму: >> как сделать разделяемую память, (как быстро передавать данные между >> мастером и worker'ом внутри Perl)? >> как сделать неблокирующее ожидание готовности одного из worker'ов (при >> котором можно заниматься вводом-выводом)? >> >> Подскажите, на чём и как такое писать!! >> Спасибо! >> >> Уважение >> Иван Харпалев >> >> >> >> -- >> Moscow.pm mailing list >> [email protected] | http://moscow.pm.org >> >> >> -- >> Moscow.pm mailing list >> [email protected] | http://moscow.pm.org > > > -- > Moscow.pm mailing list > [email protected] | http://moscow.pm.org > > > -- > Moscow.pm mailing list > [email protected] | http://moscow.pm.org
-- Moscow.pm mailing list [email protected] | http://moscow.pm.org
