YAPC::Russia no threads;
Что ждут от потоков? <ul><li>Лёгкие (память ) </li></ul><ul><li>Эффективный обмен данными </li></ul><ul><li>Выполняются па...
Что ждут от потоков? <ul><li>Лёгкие ( память ) </li></ul><ul><li>Эффективный обмен данными </li></ul><ul><li>Выполняются п...
Что ждут от потоков? <ul><li>Лёгкие ( память ) </li></ul><ul><li>Эффективный обмен данными </li></ul><ul><li>Выполняются п...
Что ждут от потоков? <ul><li>Лёгкие ( память ) </li></ul><ul><li>Эффективный обмен данными </li></ul><ul><li>Выполняются п...
Что ждут от потоков? <ul><li>Лёгкие ( память ) </li></ul><ul><li>Эффективный обмен данными </li></ul><ul><li>Выполняются п...
no Perl ? <ul><li>PHP </li></ul><ul><li>Python </li></ul><ul><li>C++/Java/C# </li></ul><ul><li>Erlang </li></ul>
Run me! <ul><li>use threads;  </li></ul><ul><li>binmode(STDOUT, &quot;:encoding(ISO-8859-1)&quot;);  </li></ul><ul><li>thr...
Run me! <ul><li>use threads;  </li></ul><ul><li>binmode(STDOUT, &quot;:encoding(ISO-8859-1)&quot;);  </li></ul><ul><li>thr...
Run me! <ul><li>use threads;  </li></ul><ul><li>opendir(DIR, &quot;/&quot;); </li></ul><ul><li>threads->create(sub{})->joi...
Run me! <ul><li>use threads;  </li></ul><ul><li>opendir(DIR, &quot;/&quot;); </li></ul><ul><li>threads->create(sub{})->joi...
<ul><li>use threads; </li></ul><ul><li>use Large::Module; </li></ul><ul><li>use Another::Large::Module; </li></ul><ul><li>...
<ul><li>use threads; </li></ul><ul><li>use Large::Module; </li></ul><ul><li>use Another::Large::Module; </li></ul><ul><li>...
<ul><li>use threads; </li></ul><ul><li>use threads::shared;  </li></ul><ul><li>my $bar :shared; </li></ul><ul><li>sub foo ...
<ul><li>use threads; </li></ul><ul><li>use threads::shared;  </li></ul><ul><li>my $bar :shared; </li></ul><ul><li>sub foo ...
<ul><li>use threads; </li></ul><ul><li>use threads::shared;  </li></ul><ul><li>my $bar :shared; </li></ul><ul><li>$bar = “...
<ul><li>use threads; </li></ul><ul><li>use threads::shared;  </li></ul><ul><li>my $bar :shared; </li></ul><ul><li>$bar = “...
<ul><li>use threads; </li></ul><ul><li>use threads::shared;  </li></ul><ul><li>my $bar :shared; </li></ul><ul><li>$bar = “...
Для чего используют потоки? <ul><li>Устранить «бутылочное горлышко» </li></ul><ul><ul><li>Сети </li></ul></ul><ul><ul><li>...
<ul><li>use threads; </li></ul><ul><li>my (@a, @b); </li></ul><ul><li>@a=(0..100_000);  </li></ul><ul><li>@b=@a;  </li></u...
<ul><li>use threads; </li></ul><ul><li>my (@a, @b); </li></ul><ul><li>@a=(0..100_000);  </li></ul><ul><li>@b=@a;  </li></u...
<ul><li>use threads; </li></ul><ul><li>my @a :shared; my @b :shared; </li></ul><ul><li>@a=(0..100_000);  </li></ul><ul><li...
<ul><li>use threads; </li></ul><ul><li>use JSON::XS; </li></ul><ul><li>threads->create(sub { </li></ul><ul><li>JSON::XS->n...
<ul><li>use threads; </li></ul><ul><li>#use JSON::XS; </li></ul><ul><li>no JSON::XS; </li></ul>Run me!
Чем заменить? <ul><li>Сеть </li></ul><ul><ul><li>AnyEvent </li></ul></ul><ul><ul><li>IO::Lambda </li></ul></ul><ul><ul><li...
Run me! <ul><li>use AnyEvent;  </li></ul><ul><li>use AnyEvent::HTTP;  </li></ul><ul><li>sub fetch_next{  </li></ul><ul><li...
Не весь  CPAN  одинаково полезен   <ul><li>package  HTTP::Async ; </li></ul><ul><li>use Time::HiRes qw/sleep/; </li></ul>...
use threads <ul><li>GUI </li></ul><ul><li>Win </li></ul>
use threads <ul><li>pre- « fork » </li></ul><ul><li>no use </li></ul><ul><li>no globals </li></ul>
Вопросы ?
Upcoming SlideShare
Loading in...5
×

No threads

1,121

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
1,121
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
8
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

No threads

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

    Clipping is a handy way to collect important slides you want to go back to later.

×