5.php 881 B

12345678910111213141516171819202122232425262728293031323334353637
  1. <?php
  2. $c1 = new chan();
  3. $c2 = new chan();
  4. function fibonacci($c1, $c2)
  5. {
  6. go(function () use ($c1, $c2) {
  7. $a = 0;
  8. $b = 1;
  9. while(1) {
  10. $read_list = [$c2];
  11. $write_list = [$c1];
  12. $result = chan::select($read_list, $write_list, 2);
  13. if ($write_list) {
  14. $t = $a + $b;
  15. $a = $b;
  16. $b = $t;
  17. $write_list[0]->push($a);
  18. }
  19. if ($read_list) {
  20. $ret = $read_list[0]->pop();
  21. if ($ret === 1) {
  22. echo "quit\n";
  23. return 1;
  24. }
  25. }
  26. }
  27. });
  28. }
  29. $num = 10;
  30. go(function () use ($c1, $c2, $num) {
  31. for ($i = 0; $i < $num; $i ++) {
  32. $ret = $c1->pop();
  33. echo "fibonacci @$i $ret\n";
  34. }
  35. $c2->push(1);
  36. });
  37. fibonacci($c1, $c2);