Your SlideShare is downloading. ×
0
No threads
No threads
No threads
No threads
No threads
No threads
No threads
No threads
No threads
No threads
No threads
No threads
No threads
No threads
No threads
No threads
No threads
No threads
No threads
No threads
No threads
No threads
No threads
No threads
No threads
No threads
No threads
No threads
No threads
No threads
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

No threads

1,104

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,104
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
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. Что ждут от потоков? <ul><li>Лёгкие (память ) </li></ul><ul><li>Эффективный обмен данными </li></ul><ul><li>Выполняются параллельно </li></ul>
  • 3. Что ждут от потоков? <ul><li>Лёгкие ( память ) </li></ul><ul><li>Эффективный обмен данными </li></ul><ul><li>Выполняются параллельно </li></ul>
  • 4. Что ждут от потоков? <ul><li>Лёгкие ( память ) </li></ul><ul><li>Эффективный обмен данными </li></ul><ul><li>Выполняются параллельно </li></ul>
  • 5. Что ждут от потоков? <ul><li>Лёгкие ( память ) </li></ul><ul><li>Эффективный обмен данными </li></ul><ul><li>Выполняются параллельно </li></ul><ul><li>Потери на синхронизацию </li></ul>
  • 6. Что ждут от потоков? <ul><li>Лёгкие ( память ) </li></ul><ul><li>Эффективный обмен данными </li></ul><ul><li>Выполняются параллельно </li></ul><ul><li>Потери на синхронизацию </li></ul><ul><li>Не требуют изменений в коде? </li></ul>
  • 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. 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. 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. 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. 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. <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. <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. <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. <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. <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. <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. <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. Для чего используют потоки? <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. <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. <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. <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. <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. <ul><li>use threads; </li></ul><ul><li>#use JSON::XS; </li></ul><ul><li>no JSON::XS; </li></ul>Run me!
  • 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. 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. Не весь 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. use threads <ul><li>GUI </li></ul><ul><li>Win </li></ul>
  • 29. use threads <ul><li>pre- « fork » </li></ul><ul><li>no use </li></ul><ul><li>no globals </li></ul>
  • 30. Вопросы ?

×