Uploaded on

 

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
1,048
On Slideshare
0
From Embeds
0
Number of Embeds
1

Actions

Shares
Downloads
7
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. YAPC::Russia no threads;
  • 2. Что ждут от потоков?
    • Лёгкие (память )
    • Эффективный обмен данными
    • Выполняются параллельно
  • 3. Что ждут от потоков?
    • Лёгкие ( память )
    • Эффективный обмен данными
    • Выполняются параллельно
  • 4. Что ждут от потоков?
    • Лёгкие ( память )
    • Эффективный обмен данными
    • Выполняются параллельно
  • 5. Что ждут от потоков?
    • Лёгкие ( память )
    • Эффективный обмен данными
    • Выполняются параллельно
    • Потери на синхронизацию
  • 6. Что ждут от потоков?
    • Лёгкие ( память )
    • Эффективный обмен данными
    • Выполняются параллельно
    • Потери на синхронизацию
    • Не требуют изменений в коде?
  • 7. no Perl ?
    • PHP
    • Python
    • C++/Java/C#
    • Erlang
  • 8. Run me!
    • use threads;
    • binmode(STDOUT, ":encoding(ISO-8859-1)");
    • threads->create(sub{}) - >join();
  • 9. Run me!
    • use threads;
    • binmode(STDOUT, ":encoding(ISO-8859-1)");
    • threads->create(sub{})->join();
    segmentation fault . /perltest/threaded-sysmalloc/bin/perl -e
  • 10. Run me!
    • use threads;
    • opendir(DIR, "/");
    • threads->create(sub{})->join();
  • 11. Run me!
    • use threads;
    • opendir(DIR, "/");
    • threads->create(sub{})->join();
    segmentation fault . /perltest/threaded-sysmalloc/bin/perl -e
  • 12.
    • use threads;
    • use Large::Module;
    • use Another::Large::Module;
    • sub foo{sleep 10}
    • threads-> create (&foo) for (1..100);
    Run me!
  • 13.
    • use threads;
    • use Large::Module;
    • use Another::Large::Module;
    • sub foo{sleep 10}
    • threads-> create (&foo) for (1..100); #oom, wtf???
    Run me!
  • 14.
    • use threads;
    • use threads::shared;
    • my $bar :shared;
    • sub foo {sleep 10}
    • threads->create(&foo)->detach() for (1..10);
    • print BSD::Process->new -> rssize ;
    Run me!
  • 15.
    • use threads;
    • use threads::shared;
    • my $bar :shared;
    • sub foo {sleep 10}
    • threads->create(&foo)->detach() for (1..10);
    • print BSD::Process->new -> rssize ; # 3276
    Run me!
  • 16.
    • use threads;
    • use threads::shared;
    • my $bar :shared;
    • $bar = “a”x1_000_000;
    • sub foo {sleep 10}
    • threads->create(&foo)->detach() for (1..10);
    • print BSD::Process->new -> rssize ;
    Run me!
  • 17.
    • use threads;
    • use threads::shared;
    • my $bar :shared;
    • $bar = “a”x1_000_000;
    • sub foo {sleep 10}
    • threads->create(&foo)->detach() for (1..10);
    • print BSD::Process->new -> rssize ; # 8935
    Run me!
  • 18.
    • use threads;
    • use threads::shared;
    • my $bar :shared;
    • $bar = “a”x1_000_000; # magic inside
    • sub foo {sleep 10}
    • threads->create(&foo)->detach() for (1..10);
    • print BSD::Process->new -> rssize ;
    Run me!
  • 19. Для чего используют потоки?
    • Устранить «бутылочное горлышко»
      • Сети
      • Одного процессора
      • Диска
    • Уменьшить время отклика системы
  • 20.
    • use threads;
    • my (@a, @b);
    • @a=(0..100_000);
    • @b=@a;
    • @a=sort @a;
    • @b=sort @b;
    • time ./bin/perl test_nothr.pl
    • 0.1 9 s user 0.0 2 s system 99% cpu 0. 208 total
    Run me!
  • 21.
    • use threads;
    • my (@a, @b);
    • @a=(0..100_000);
    • @b=@a;
    • push @thr,
    • threads->create(sub{@a=sort@a}),
    • threads->create(sub{@b=sort@b});
    • $_->join() for @thr;
    • time ./bin/perl test_thr.pl
    • 1.18s user 0.15s system 147% cpu 0.898 total
    Run me!
  • 22.
    • use threads;
    • my @a :shared; my @b :shared;
    • @a=(0..100_000);
    • @b=@a;
    • push @thr,
    • threads->create(sub{@a=sort@a}),
    • threads->create(sub{@b=sort@b});
    • $_->join() for @thr;
    • time ./bin/perl test_thr.pl
    • 1. 31 s user 0.15s system 1 51 % cpu 0. 960 total
    Run me!
  • 23.
    • use threads;
    • use JSON::XS;
    • threads->create(sub {
    • JSON::XS->new->….;
    • });
    Run me!
  • 24.
    • use threads;
    • #use JSON::XS;
    • no JSON::XS;
    Run me!
  • 25. Чем заменить?
    • Сеть
      • AnyEvent
      • IO::Lambda
      • Coro
    • Диск
      • IO::Async
      • IO::AIO
    • Процессор
      • Gearman
      • plain old fork
  • 26. Run me!
    • use AnyEvent;
    • use AnyEvent::HTTP;
    • sub fetch_next{
    • my $domain = shift @list;
    • http_request
      • GET => "http://$domain/favicon.ico",
      • recurse => 0,
      • timeout => 30,
      • cookie_jar => {},
      • headers => {Referer => "http://$domain/"},
      • sub {
      • my ($data, $headers) = @_;
      • if ($headers->{'Status'} == 200){
      • #process data
      • }
      • fetch_next();
      • }
      • ;
    • }
  • 27. Не весь CPAN одинаково полезен 
    • package HTTP::Async ;
    • use Time::HiRes qw/sleep/;
    • $self->{ poll_interval } = 0.05;
    • sub _next_response {
    • sleep $self-> { poll_interval } ;
    • }
  • 28. use threads
    • GUI
    • Win
  • 29. use threads
    • pre- « fork »
    • no use
    • no globals
  • 30. Вопросы ?