waitgroup.php 630 B

123456789101112131415161718192021222324252627282930313233343536373839
  1. <?php
  2. class WaitGroup {
  3. private $count = 0;
  4. private $chan;
  5. function __construct() {
  6. $this->chan = new chan;
  7. }
  8. function add() {
  9. $this->count++;
  10. }
  11. function done() {
  12. $this->chan->push(true);
  13. }
  14. function wait() {
  15. while ($this->count--) {
  16. $this->chan->pop();
  17. }
  18. }
  19. }
  20. go(function () {
  21. $wg = new WaitGroup;
  22. for($i=0;$i<10;$i++) {
  23. $wg->add();
  24. go(function() use ($wg, $i) {
  25. co::sleep(.3);
  26. echo "hello $i\n";
  27. $wg->done();
  28. });
  29. }
  30. $wg->wait();
  31. echo "all done\n";
  32. });