PHP中使用協同程序實現合作多任務(4)_PHP教程

      編輯Tag賺U幣
      教程Tag:暫無Tag,歡迎添加,賺取U幣!

      推薦:php修改NetBeans默認字體的大小
      在Netbeans中由于使用了Swing進行開發,所以其中界面的字體也是由Java虛擬機進行配置而不是隨操作系統的。在安裝完Netbeans后默認的字體大小是11px。而在Windows下的宋體最小支持12px。所以字體為11px就已經無法完整顯示了。 簡單的解決辦法就是將字體改大一點。詳細的

              if ($retval instanceof SystemCall) {
                  $retval($task, $this);
                  continue;
              }

              if ($task->isFinished()) {
                  unset($this->taskMap[$task->getTaskId()]);
              } else {
                  $this->schedule($task);
              }
          }
      }

      第一個系統調用除了返回任務ID外什么都沒有做:

      復制代碼 代碼如下:
      <?php
      function getTaskId() {
          return new SystemCall(function(Task $task, Scheduler $scheduler) {
              $task->setSendValue($task->getTaskId());
              $scheduler->schedule($task);
          });
      }

      這個函數確實設置任務id為下一次發送的值,并再次調度了這個任務。由于使用了系統調用,所以調度器不能自動調用任務,我們需要手工調度任務(稍后你將明白為什么這么做)。要使用這個新的系統調用的話,我們要重新編寫以前的例子:

      復制代碼 代碼如下:
      <?php

      function task($max) {
          $tid = (yield getTaskId()); // <-- here's the syscall!
          for ($i = 1; $i <= $max; ++$i) {
              echo "This is task $tid iteration $i.\n";
              yield;
          }
      }

      $scheduler = new Scheduler;

      $scheduler->newTask(task(10));
      $scheduler->newTask(task(5));

      $scheduler->run();

      這段代碼將給出與前一個例子相同的輸出。注意系統調用同其他任何調用一樣正常地運行,不過預先增加了yield。要創建新的任務,然后再殺死它們的話,需要兩個以上的系統調用:  

      復制代碼 代碼如下:
      <?php

      function newTask(Generator $coroutine) {
          return new SystemCall(
              function(Task $task, Scheduler $scheduler) use ($coroutine) {
                  $task->setSendValue($scheduler->newTask($coroutine));
                  $scheduler->schedule($task);
              }
          );
      }

      function killTask($tid) {
          return new SystemCall(
              function(Task $task, Scheduler $scheduler) use ($tid) {
                  $task->setSendValue($scheduler->killTask($tid));
                  $scheduler->schedule($task);
              }
          );
      }

      killTask函數需要在調度器里增加一個方法:

      復制代碼 代碼如下:
      <?php

      public function killTask($tid) {
          if (!isset($this->taskMap[$tid])) {
              return false;
          }

          unset($this->taskMap[$tid]);

          // This is a bit ugly and could be optimized so it does not have to walk the queue,
          // but assuming that killing tasks is rather rare I won't bother with it now
          foreach ($this->taskQueue as $i => $task) {
              if ($task->getTaskId() === $tid) {
                  unset($this->taskQueue[$i]);
                  break;
              }
          }

          return true;
      }

      用來測試新功能的微腳本:  

      復制代碼 代碼如下:
      <?php

      function childTask() {
          $tid = (yield getTaskId());
          while (true) {
              echo "Child task $tid still alive!\n";
              yield;
          }
      }

      function task() {
          $tid = (yield getTaskId());
          $childTid = (yield newTask(childTask()));

          for ($i = 1; $i <= 6; ++$i) {
              echo "Parent task $tid iteration $i.\n";
              yield;

              if ($i == 3) yield killTask($childTid);
          }
      }

      $scheduler = new Scheduler;
      $scheduler->newTask(task());
      $scheduler->run();

      分享:PHP刪除數組中特定元素的兩種方法
      這篇文章介紹了PHP中刪除數組中特定元素的兩種方法,有需要的朋友可以參考一下 方法一: 復制代碼 代碼如下: ?php $arr1 = array(1,3, 5,7,8); $key = array_search(3, $arr1); if ($key !== false) array_splice($arr1, $key, 1); var_dump($arr1); ? 輸出: array(4)

      來源:模板無憂//所屬分類:PHP教程/更新時間:2013-07-03
      相關PHP教程