Guest User

Untitled

a guest
Apr 23rd, 2018
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.35 KB | None | 0 0
  1. #!/usr/bin/env perl
  2. use strict;
  3. use warnings;
  4.  
  5. use Coro;
  6. use Perl6::Say;
  7.  
  8. # とりあえず分かったことをまとめてみた
  9. # 間違ってるかもしれないので教えてくれるとうれしい
  10. #
  11. # NOTE: コルーチン(継続?)の性質上読む場所が二転三転します
  12.  
  13.  
  14. # cedeは以下のことを行うもの
  15. #
  16. # 1. 現在の継続をエンキュー (push)
  17. # - これをするのが$Coro::current->ready()
  18. # 2. 先頭の継続をデキュー (unshift)
  19. # - これがschedule()
  20.  
  21.  
  22.  
  23.  
  24. sub printit {
  25. my $s = shift;
  26.  
  27. # 1回目のcedeでは
  28. # キュー: [<async>, <main>]
  29. # push: [<async>, <main>], <printit>
  30. # unshift: <async> <= [<main>, <printit>]
  31. # そして2個目の<async>に飛ぶ。
  32. #
  33. # そうするとまたprintit()が呼ばれているので
  34. # この2回目のcedeでは
  35. # キュー: [<main>, <printit>]
  36. # push: [<main>, <printit>], <printit>
  37. # unshift: <main> <= [<printit>, <printit>]
  38. # となって、<main>に飛ぶ。
  39. cede;
  40.  
  41. # ここでエンキューされた2つの<printit>がようやく処理される。
  42. #
  43. # 1回目:
  44. # 1個目の<printit>が継続されているのでキューの中身は
  45. # [<printit>, <main>]
  46. # 2回目:
  47. # 2個目の<printit>が継続中。キューの中身は
  48. # [<main>]
  49. print $s;
  50.  
  51. # <main> <= []
  52. # <main>に戻る。
  53. }
  54.  
  55.  
  56. # [<async>]
  57. async { printit "hello, " };
  58. # [<async>, <async>]
  59. async { printit "wolrd\n" };
  60.  
  61.  
  62. # cedeはこのキューに対して現在の継続(この場合メイン継続)
  63. # をpushし、先頭のキューをunshiftする。
  64.  
  65. # キュー: [<async>, <async>]
  66. # push: [<async>, <async>], <main>
  67. # unshift: <async> <= [<async>, <main>]
  68. # そして取り出された1回目の<async>(つまりprintit())に飛ぶ。
  69. cede;
  70.  
  71. # キュー: [<printit>, <printit>]
  72. # push: [<printit>, <printit>], <main>
  73. # unshift: <printit> <= [<printit>, <main>]
  74. # <printit>に飛ぶ。
  75. cede;
  76.  
  77.  
  78.  
  79. # キュー上に<main>しかないので<main>に戻り終了。
  80. # この時キュー上は
  81. # []
  82. #
  83. # キューに継続が残ってても処理されず破棄される。
  84. # 逆にキューに継続が残っていない場合にscheduleすると
  85. # アンダーフローを起こしてエラーになる。
  86. # 「FATAL: deadlock detected at ...」
  87.  
  88. # NOTE: やめて!
  89. # schedule;
Add Comment
Please, Sign In to add comment