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

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

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

          public function run() {
              while (!$this->taskQueue->isEmpty()) {
                  $task = $this->taskQueue->dequeue();
                  $task->run();

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

       newTask()方法(使用下一個空閑的任務id)創建一個新任務,然后把這個任務放入任務映射數組里。接著它通過把任務放入任務隊列里來實現 對任務的調度。接著run()方法掃描任務隊列,運行任務。如果一個任務結束了,那么它將從隊列里刪除,否則它將在隊列的末尾再次被調度。
       讓我們看看下面具有兩個簡單(并且沒有什么意義)任務的調度器: 

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

      function task1() {
          for ($i = 1; $i <= 10; ++$i) {
              echo "This is task 1 iteration $i.\n";
              yield;
          }
      }

      function task2() {
          for ($i = 1; $i <= 5; ++$i) {
              echo "This is task 2 iteration $i.\n";
              yield;
          }
      }

      $scheduler = new Scheduler;

      $scheduler->newTask(task1());
      $scheduler->newTask(task2());

      $scheduler->run();

       兩個任務都僅僅回顯一條信息,然后使用yield把控制回傳給調度器。輸出結果如下:

       

      復制代碼 代碼如下:
       This is task 1 iteration 1.
      This is task 2 iteration 1.
      This is task 1 iteration 2.
      This is task 2 iteration 2.
      This is task 1 iteration 3.
      This is task 2 iteration 3.
      This is task 1 iteration 4.
      This is task 2 iteration 4.
      This is task 1 iteration 5.
      This is task 2 iteration 5.
      This is task 1 iteration 6.
      This is task 1 iteration 7.
      This is task 1 iteration 8.
      This is task 1 iteration 9.
      This is task 1 iteration 10.
       

      輸出確實如我們所期望的:對前五個迭代來說,兩個任務是交替運行的,接著第二個任務結束后,只有第一個任務繼續運行。  

      與調度器之間通信

      既然調度器已經運行了,那么我們就轉向日程表的下一項:任務和調度器之間的通信。我們將使用進程用來和操作系統會話的同樣的方式來通信:系統調用。 我們需要系統調用的理由是操作系統與進程相比它處在不同的權限級別上。因此為了執行特權級別的操作(如殺死另一個進程),就不得不以某種方式把控制傳回給 內核,這樣內核就可以執行所說的操作了。再說一遍,這種行為在內部是通過使用中斷指令來實現的。過去使用的是通用的int指令,如今使用的是更特殊并且更 快速的syscall/sysenter指令。

      我們的任務調度系統將反映這種設計:不是簡單地把調度器傳遞給任務(這樣久允許它做它想做的任何事),我們將通過給yield表達式傳遞信息來與系統調用通信。這兒yield即是中斷,也是傳遞信息給調度器(和從調度器傳遞出信息)的方法。 

      為了說明系統調用,我將對可調用的系統調用做一個小小的封裝:
       

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

      class SystemCall {
          protected $callback;

          public function __construct(callable $callback) {
              $this->callback = $callback;
          }

          public function __invoke(Task $task, Scheduler $scheduler) {
              $callback = $this->callback; // Can't call it directly in PHP :/
              return $callback($task, $scheduler);
          }
      }

      它將像其他任何可調用那樣(使用_invoke)運行,不過它要求調度器把正在調用的任務和自身傳遞給這個函數。為了解決這個問題 我們不得不微微的修改調度器的run方法:

      復制代碼 代碼如下:
      <?php
      public function run() {
          while (!$this->taskQueue->isEmpty()) {
              $task = $this->taskQueue->dequeue();
              $retval = $task->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教程