[Moscow.pm] Обмен данными с потоком.

Victor Efimov victor на vsespb.ru
Чт Июн 5 05:07:49 PDT 2014


5 июня 2014 г., 15:46 пользователь Харпалёв Иван
<ivan.kharpalev на gmail.com> написал:
> Добрый день, могучий MoscowPM
>
> Опять про параллельную обработку.
>
> Хочется написать вот такую схему обработки ввода:
> master создаёт work'ов,
> читает порции из файла, раздаёт порции worker'ам
> ждёт, пока worker обработает, получает ответ worker'a
> пишет результат в файл.
> Так же мастер буфереизует вывод, чтобы выход писался в правильном порядке.
мастер же один поток, ему не нужно думать о порядке.

>
> Самое туманное:
> Как передавать данные от мастера к worker'у и Обратно?!!!!
> Как ждать готовности?!!!

схема с fork, без Core/AE

данными обмениваться через pipe. создаём pipe. например так
https://github.com/vsespb/mt-aws-glacier/blob/421f9d04b96a4657d89eb7ef2bc66aee15b8cec3/lib/App/MtAws/ForkEngine.pm#L174

мастер сидит, ничего не делает. ждёт запросов от воркеров.

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

мастер же с помощью IO::Select ( например так
https://github.com/vsespb/mt-aws-glacier/blob/421f9d04b96a4657d89eb7ef2bc66aee15b8cec3/lib/App/MtAws/ParentWorker.pm#L54
) получает запросы от воркеров. читать данные он должен спомощью того
пайпа из которого читают, а писать в другой.

мастер, когда получает задание от воркера, тогда и читает данные из
файла (это всё имеет смысл если чтение "быстрое")

> Должна ли такая схема (работа с диском из одного места) дать ускорение по
> сравнению с чтением/записью файла в каждом worker'е?

такая схема должна дать ускорение если воркеры сильно тормозят (тратят
время на CPU или IO). В случае IO, можно обойтись и без неё.
так же для неё нужно чтобы мастер был быстрым. быстро отдавал задания.
основная нагрузка на воркеры.

>
> смотрел на Coro, увидел Coro::Simaphore, Coro::Signal ... но не пойму:
>   как сделать разделяемую память, (как быстро передавать данные между
> мастером и worker'ом внутри Perl)?
>   как сделать неблокирующее ожидание готовности одного из worker'ов (при
> котором можно заниматься вводом-выводом)?
>
> Подскажите, на чём и как такое писать!!
> Спасибо!
>
> Уважение
> Иван Харпалев
>
>
>
> --
> Moscow.pm mailing list
> moscow-pm на pm.org | http://moscow.pm.org
>


Подробная информация о списке рассылки Moscow-pm