May POE
POE
фреймворк
событийная
  машина
POE 1.0002
  11 мая 2008
760
 297
Уровни
абстракции
0.



     внутренний
1.



ядро и сессии
2.

      wheel’ы,
     фильтры и
     драйвера
3.



     компоненты
4.

фреймворки и
  объектные
представления
0. внутренний



 POE::Loop
POE::Resource
POE::Loop
• POE::Loop::Select
• POE::Loop::IO_Poll
• POE::Loop::Event / POE::Loop::Event_Lib
• POE::Loop::Glib
• POE::Loop::Gtk / PO...
use POE::Loop::Event_Lib;
use POE;


 или

use POE qw( Loop::Event_Lib );


 или

use POE::Kernel { loop => 'Event_Lib' };
1. ядро и сессии


  POE::Kernel
  POE::Session
   POE::NFA
POE::Kernel
• мультплексирующий ввод-вывод
• управление сигналами
• таймеры
• watcher’ы и select’ы
• служебные функции
• $poe_kernel и...
• post SESSION, STATE [ , ARGS ]
• yield STATE [ , ARGS ]
• call SESSION, STATE [ , ARGS ]
• alarm STATE [ , TIME [, ARGS]...
POE::Session
• $_[KERNEL]
• $_[SESSION] / $_[SENDER] / $_[STATE]
• $_[OBJECT]
• $_[HEAP]
• $_[ARG0] .. $_[ARG9]
• $_[CALLER_*]
• _start [ ARGS ]
• _stop
• _parent OLD, NEW
• _child REASON, CHILD [ ,VALUE ]
use POE;
use POE::Kernel;
use POE::Session;

POE::Session->create(

 inline_states => {

 
 _start => sub {

 
 
 $_[KERNE...
POE::Queue::Array
POE::XS::Queue::Array
use POE;
use POE::XS::Queue::Array;

POE::Session->create( ... );
POE::Kernel->run;
2. wheel’ы, фильтры и драйвера


  POE::Wheel
   POE::Filter
  POE::Driver
POE::Wheel
• POE::Wheel::ReadWrite
• POE::Wheel::SocketFactory
• POE::Wheel::ListenAccept
• POE::Wheel::ReadLine
• POE::Wheel::Run
• ...
use POE qw( Wheel::Run Filter::Line Filter::Stream );
...
my $wheel = POE::Wheel::Run->new(

 Program      => [ '/usr/sbin...
POE::Filter
• POE::Filter::Stream
• POE::Filter::Line
• POE::Filter::Block / POE::Filter::RecordBlock
• POE::Filter::Grep / POE::Filte...
• POE::Filter::XML
• POE::Filter::JSON
• POE::Filter::CSV
• POE::Filter::Bzip2 / POE::Filter::Zlib / ...
• POE::Filter::Sn...
use POE::Filter::Reference;
use Data::Dumper;

my $data = [

 { 'name' => 'Perl Today', 'date' => '26.10.2007' },

 { 'nam...
POE::Driver
POE::Driver::SysRW
3. компоненты



POE::Component
    (PoCo)
POE::Session
     +
POE::Wheel
     +
  логика
215
• PoCo::Client::TCP / PoCo::Server::TCP
• PoCo::Client::DNS / PoCo::Server::DNS
• PoCo::Server::SMTP / PoCo::Server::POP3
...
• PoCo::Child
• PoCo::Pool::Thread
• PoCo::IKC / PoCo::TIKC
• PoCo::IRC
• PoCo::FastCGI
• PoCo::Server::SOAP
• PoCo::Serve...
Баги
• PoCo::Client::KeepAlive
• PoCo::Client::HTTP
• PoCo::Server::SimpleHTTP
• POE::Wheel::Run
ToDo
• PoCo::Client::BerkleyDB / BDB
• PoCo::Client::Memcached
• PoCo::CGI / PoCo::Server::CGI
• POE::Filter::HTTPD::Request /
...
4. фреймворки


   Sprocket
  POE::Stage
 MooseX::POE
PHPPOE
http://code.google.com/p/phppoe/
Рекомендации
• использовать последнюю версию
• POE::XS::Queue::Array
• не злоупотреблять yield
• помнить: событие может заблокировать
 ...
Профилирование
• POE::Session option(trace => 1)
• sub PoCo::*::DEBUG () { 1 }
• sub POE::Kernel::ASSERT_DEFAULT () { 1 }
• sub POE::Kern...
Пример
редирект-сервер
PoCo::Server::SimpleHTTP
use POE 1.0002;
use POE::XS::Queue::Array;
use POE::Component::Server::SimpleHTTP;
use URI;

our $SERVER = [ 192.168.1.100...
POE::Session->create( inline_states => {

 _start => sub {

    $_[KERNEL]->alias_set( 'MANAGER' );

 },

 got_request => ...
Альтернативы
HOE 0.00_01
  22 января 2006
• IO::Async
• IO::Lambda
• Event
• Event::Lib
• EV
• AnyEvent
• libevent / libev / libasync / libsigc++ (C/C++)
• Cocoa (Objective-C)
• Twisted (Python)
• PRADO (PHP5)
• jemula (Java)
...
Справочная
информация
• http://search.cpan.org/~rcaputo/POE
• http://poe.perl.org
• http://poe.svn.sourceforge.net
• http://groups.google.com/gr...
POE
Анатолий Шарифулин
  RostovOnDon.pm
        2008
Upcoming SlideShare
Loading in …5
×

May POE

1,513 views

Published on

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,513
On SlideShare
0
From Embeds
0
Number of Embeds
13
Actions
Shares
0
Downloads
8
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

May POE

  1. 1. May POE
  2. 2. POE
  3. 3. фреймворк
  4. 4. событийная машина
  5. 5. POE 1.0002 11 мая 2008
  6. 6. 760 297
  7. 7. Уровни абстракции
  8. 8. 0. внутренний
  9. 9. 1. ядро и сессии
  10. 10. 2. wheel’ы, фильтры и драйвера
  11. 11. 3. компоненты
  12. 12. 4. фреймворки и объектные представления
  13. 13. 0. внутренний POE::Loop POE::Resource
  14. 14. POE::Loop
  15. 15. • POE::Loop::Select • POE::Loop::IO_Poll • POE::Loop::Event / POE::Loop::Event_Lib • POE::Loop::Glib • POE::Loop::Gtk / POE::Loop::Gtk2 / POE::Loop::Tk / POE::Loop::Wx / POE::Loop::Prima
  16. 16. use POE::Loop::Event_Lib; use POE; или use POE qw( Loop::Event_Lib ); или use POE::Kernel { loop => 'Event_Lib' };
  17. 17. 1. ядро и сессии POE::Kernel POE::Session POE::NFA
  18. 18. POE::Kernel
  19. 19. • мультплексирующий ввод-вывод • управление сигналами • таймеры • watcher’ы и select’ы • служебные функции • $poe_kernel и $poe_main_window
  20. 20. • post SESSION, STATE [ , ARGS ] • yield STATE [ , ARGS ] • call SESSION, STATE [ , ARGS ] • alarm STATE [ , TIME [, ARGS] ] / alarm_* • delay STATE, DELAY [ , ARGS ] / delay_*
  21. 21. POE::Session
  22. 22. • $_[KERNEL] • $_[SESSION] / $_[SENDER] / $_[STATE] • $_[OBJECT] • $_[HEAP] • $_[ARG0] .. $_[ARG9] • $_[CALLER_*]
  23. 23. • _start [ ARGS ] • _stop • _parent OLD, NEW • _child REASON, CHILD [ ,VALUE ]
  24. 24. use POE; use POE::Kernel; use POE::Session; POE::Session->create( inline_states => { _start => sub { $_[KERNEL]->yield( $_[STATE] ); }, }, )->option( trace => 1 ); POE::Kernel->run;
  25. 25. POE::Queue::Array POE::XS::Queue::Array
  26. 26. use POE; use POE::XS::Queue::Array; POE::Session->create( ... ); POE::Kernel->run;
  27. 27. 2. wheel’ы, фильтры и драйвера POE::Wheel POE::Filter POE::Driver
  28. 28. POE::Wheel
  29. 29. • POE::Wheel::ReadWrite • POE::Wheel::SocketFactory • POE::Wheel::ListenAccept • POE::Wheel::ReadLine • POE::Wheel::Run • POE::Wheel::FollowTail • POE::Wheel::Curses
  30. 30. use POE qw( Wheel::Run Filter::Line Filter::Stream ); ... my $wheel = POE::Wheel::Run->new( Program => [ '/usr/sbin/sendmail', '-i', '-t' ], StdinEvent => 'stdin', StdinFilter => POE::Filter::Line->new, StdoutEvent => 'stdout', StdoutFilter => POE::Filter::Stream->new, StderrEvent => 'stderr', StderrFilter => POE::Filter::Stream->new, ErrorEvent => 'error', CloseEvent => 'close', ); $wheel->put( $_[ARG0] );
  31. 31. POE::Filter
  32. 32. • POE::Filter::Stream • POE::Filter::Line • POE::Filter::Block / POE::Filter::RecordBlock • POE::Filter::Grep / POE::Filter::Map • POE::Filter::Reference • POE::Filter::HTTPD • POE::Filter::Stackable
  33. 33. • POE::Filter::XML • POE::Filter::JSON • POE::Filter::CSV • POE::Filter::Bzip2 / POE::Filter::Zlib / ... • POE::Filter::Snort • POE::Filter::Stomp • POE::Filter::IRCD
  34. 34. use POE::Filter::Reference; use Data::Dumper; my $data = [ { 'name' => 'Perl Today', 'date' => '26.10.2007' }, { 'name' => 'May Perl', 'date' => '17-18.05.2008' }, ]; for (POE::Filter::Reference->new) { warn Dumper my $put = $_->put($data); # freez ... warn Dumper $_->get($put); # thaw }
  35. 35. POE::Driver POE::Driver::SysRW
  36. 36. 3. компоненты POE::Component (PoCo)
  37. 37. POE::Session + POE::Wheel + логика
  38. 38. 215
  39. 39. • PoCo::Client::TCP / PoCo::Server::TCP • PoCo::Client::DNS / PoCo::Server::DNS • PoCo::Server::SMTP / PoCo::Server::POP3 • PoCo::Client::HTTP / PoCo::Server::HTTP • PoCo::Server::SimpleHTTP • PoCo::SimpleDBI • PoCo::Generic
  40. 40. • PoCo::Child • PoCo::Pool::Thread • PoCo::IKC / PoCo::TIKC • PoCo::IRC • PoCo::FastCGI • PoCo::Server::SOAP • PoCo::Server::XMLRPC / JSONRPC
  41. 41. Баги
  42. 42. • PoCo::Client::KeepAlive • PoCo::Client::HTTP • PoCo::Server::SimpleHTTP • POE::Wheel::Run
  43. 43. ToDo
  44. 44. • PoCo::Client::BerkleyDB / BDB • PoCo::Client::Memcached • PoCo::CGI / PoCo::Server::CGI • POE::Filter::HTTPD::Request / POE::Filter::HTTPD::Response
  45. 45. 4. фреймворки Sprocket POE::Stage MooseX::POE
  46. 46. PHPPOE http://code.google.com/p/phppoe/
  47. 47. Рекомендации
  48. 48. • использовать последнюю версию • POE::XS::Queue::Array • не злоупотреблять yield • помнить: событие может заблокировать весь процесс
  49. 49. Профилирование
  50. 50. • POE::Session option(trace => 1) • sub PoCo::*::DEBUG () { 1 } • sub POE::Kernel::ASSERT_DEFAULT () { 1 } • sub POE::Kernel::TRACE_DEFAULT () { 1 } • POE::Devel::Profiler
  51. 51. Пример
  52. 52. редирект-сервер
  53. 53. PoCo::Server::SimpleHTTP
  54. 54. use POE 1.0002; use POE::XS::Queue::Array; use POE::Component::Server::SimpleHTTP; use URI; our $SERVER = [ 192.168.1.100, 192.168.1.101, ... ]; POE::Component::Server::SimpleHTTP->new( ALIAS => 'REDIRECTD', ADDRESS => '192.168.0.1', PORT => 80, HOSTNAME => 'redirect.server.my', HANDLERS => [{ DIR => '.*', SESSION => 'MANAGER', EVENT => 'got_request' }] );
  55. 55. POE::Session->create( inline_states => { _start => sub { $_[KERNEL]->alias_set( 'MANAGER' ); }, got_request => sub { for ( $_[ARG1] ) { $_->code ( 303 ); $_->header( Location => 'http://'.$SERVER->[rand @$SERVER].URI->new( $_[ARG0]->uri )->path ); $_[KERNEL]->post('REDIRECTD' => 'DONE', $_); }, }, } )->option( trace => 1 ); POE::Kernel->run;
  56. 56. Альтернативы
  57. 57. HOE 0.00_01 22 января 2006
  58. 58. • IO::Async • IO::Lambda • Event • Event::Lib • EV • AnyEvent
  59. 59. • libevent / libev / libasync / libsigc++ (C/C++) • Cocoa (Objective-C) • Twisted (Python) • PRADO (PHP5) • jemula (Java) • “event loop” (TCL)
  60. 60. Справочная информация
  61. 61. • http://search.cpan.org/~rcaputo/POE • http://poe.perl.org • http://poe.svn.sourceforge.net • http://groups.google.com/group/perl.poe
  62. 62. POE
  63. 63. Анатолий Шарифулин RostovOnDon.pm 2008

×