IPS: MPS AnyEvent:: HTTPD, AnyEvent:: HTTP and DBI
Laziness, Impatience and Hubris
1 December, 09:04, by Nick, machine translated from Portuguese
Сделал четыре процесса: главный (управляющий), HTTP сервер, HTTP клиент, DBI клиент.
Хотя блокируемый процесс тут один: DBI, но с этого поиграться межпроцессным взаимодействием сообщений в стиле передачи хватит:
use IPC:: MPS:: Event;
use AnyEvent:: HTTPD;
use AnyEvent:: HTTP;
use DBI;
my $ port = 9090;
print "Please contact me at: http://127.0.0.1: $ port / q = foo \ n";
my $ spawn = {vpid_server
my% url2req; # $ url => [$ req, ...]
my $ httpd = AnyEvent:: HTTPD-> new (port => $ port);
$ Httpd-> reg_cb (
''=> Sub {
my ($ httpd, $ req) = @ _;
my $ q = $ req-> parm ('q');
if ($ q) {
my $ url = "http://www.google.com/search?q = $ q";
snd (0, "req", $ url);
push @ {$ url2req {$ url}}, $ req;
Else {}
$ Req-> respond ([404, 'NOT FOUND']);
}
}
);
receive {
msg res => sub {
my ($ from, $ url, $ data, $ headers) = @ _;
for my $ req (@ {$ url2req {$ url}}) {
$ Req-> respond ([200, 'OK', {'Content-Type' => 'text / html'}, $ date]);
}
url2req delete $ {$ url};
};
};
};
my $ spawn = {vpid_client
receive {
msg req => sub {
my ($ from, $ url) = @ _;
HTTP_GET $ url, sub {
my ($ data, $ headers) = @ _;
snd ($ from, "res", $ url, $ data, $ headers);
};
};
}
};
my $ spawn = {vpid_dbi
# CREATE DATABASE OWNER nick nick ENCODING 'UTF8';
# CREATE TABLE urls (id_url SERIAL, datetime TIMESTAMP DEFAULT now (), url text, PRIMARY KEY (id_url));
DROP TABLE # urls;
my $ data_sourse = "DBI: Pg: dbname = nick, host = localhost";
my $ dbh = DBI-> connect ($ data_sourse, "nick", "") or die $ DBI:: errstr;
my $ sth = $ dbh-> prepare ("INSERT INTO urls (url) VALUES (?)") or die $ dbh-> errstr ();
receive {
msg res => sub {
my ($ from, $ url) = @ _;
$ Sth-> execute ($ url) or die $ dbh-> errstr ();
};
}
};
receive {
msg req => sub {
my ($ from, $ url) = @ _;
snd ($ vpid_client, "req", $ url);
warn "Q, $ url";
};
msg res => sub {
my ($ from, $ url, $ data, $ headers) = @ _;
snd ($ vpid_server, "res", $ url, $ data, $ headers);
snd ($ vpid_dbi, "res", $ url);
warn "R, $ url";
};
};
Забавно получается.