?

Log in

No account? Create an account
Previous Entry Share
Многопоточная качалка на Erlang
what_me
Ну вот, моя первая программа на эрланге. https://github.com/onokhov/erlang_web_crawler/

Язык занятный. Параллелить и устраивать межпроцессное общение просто. Но остальное писать неудобно, думаю, что просто с непривычки. И документацию я ещё не прочитал. Осилил только getting_started, описания модулей string, list, re, httpc и ещё некоторых.
Сторонние модули использовать не хотелось, поэтому то, что в штатных модулях не нашел, делал сам.

Сравнил по производительности с перловой качалкой, эрланговская получилась немного быстрее. За минуту с форума glav.su перловая вытянула 26МБ, а эрланговская 26,7МБ.

Хотелось бы критики по коду от людей эрланг знающих.

Update: Закоммитил правки по комментариям. Заменены паттерны, ++ заменен на [|], использованы list comprehensions.
Update 2: Отказ от prespawn. И правки по стилю
Update 3: Багфикс в receive_text_data/2. Правки по стилю
Tags: ,

  • 1
[ exit(Pid, stop) || Pid <- FreeWorkerPids ], % посылаем сигналы остановки воркерам

ty otkuda eti Pidy vzjal?
IZ FAJLA.
cikl zhizni fajla ne sovpadajet s ciklom zhizni pidov!
na moment zapuska etoj komandy eti Pidy mogut oznachatj vsjo chto ugodno! ty riskujesh poubivatj processy kotoryje nikakogo otnoshenija k tebe ne imejut.

Нет, пиды не сохраняются в файле. Они на каждый запуск свои, и убиваются именно живые. А в файле только урлы

ne nado tak delatj vsjo ravno.
posmotri chto takoje spawn_link(), spawn_monitor(), i monitor().
ty mozhesh nadjozhno sdelatj tak chto porozhdjonnyje toboj processy avtomatom umrut kogda tvoj process umrjot.

da, ja vizhu chto oshibsja po povodu fajla.
pytajusj chitatj i zhratvu gotovitj odnovremenno.

ja by perenjos telo crawler([],[],_,_,_,_)
celikom v crawler/2
potomushto imenno crawler/2 sozdal konteksty inetc i httpc -- vsegda xorosho videtj nachalo i konec V ODNOM TELE -- a u tebja odna funkcija choto sozdala a druga poubivala -- trudno chitatj trudno najti oshibku jesli vdrug choto budet ubito nevovremja.

Edited at 2017-01-09 04:17 pm (UTC)

Re: po povodu stilja.

это не понимаю. Мне двух параметров не хватит, чтоб перевызывать функцию в новом состоянии.

smotri:

crawler(Url, NumWorkers) when NumWorkers >= 1 ->
inets:start(),
ssl:start(),
FreeWorkerPids = [ spawn(crawler, worker, [self()]) || _ <- lists:seq(1, NumWorkers) ],
% SDELANO IZMENENIJE GLOBALJNOGO SOSTOJANIJA, novyje processy, novyje sluzhby.
...
...
...
crawler([], [Url], FreeWorkerPids, [], [], Host)
...
.

crawler([], [], FreeWorkerPids, _SeenUrls, _UrlsInProgress, Host) ->
[ exit(Pid, stop) || Pid <- FreeWorkerPids ],
ssl:stop(),
inets:stop()
% OBRATNOJE IZMENENIJE GLOBALJNOGO SOSTOJANIJA
.

dve vzaimosvjazannyje akcii drug bez druga nikuda, lezhat v raznyx funkcijax.


nado tak:

crawler(Url, NumWorkers) when NumWorkers >= 1 ->
inets:start(),
ssl:start(),
FreeWorkerPids = [ spawn(crawler, worker, [self()]) || _ <- lists:seq(1, NumWorkers) ],
...
crawler([], [Url], FreeWorkerPids, [], [], Host)
...
[ exit(Pid, stop) || Pid <- FreeWorkerPids ],
ssl:stop(),
inets:stop()
.

crawler([], [], _FreeWorkerPids, _SeenUrls, _UrlsInProgress, Host) ->
file:remove(...).

tojestj crawler/2 sozdajot nuzhnuju dlja crawler/5 sredu i on zhe jejo ubivajet!

a crawler/5 sozdajot fajl i on zhe jego udaljajet.

i chitatj legche, vse eti "start()" i "stop()" chitajuca kak skobki svojego roda.

ubedil. sozdam na stuco.co kurs Erlanga.

  • 1