履歴
2018/11/13
・task.js(timeout interval)、 task-test05-main.js追加
・task.jsファイル中のコメント(grobal->global)
2018/11/08
・バグ(タスクの切り替え)を取りました
・いろいろな問題とは作成中のセマフォのP/V操作の問題(自分のバグ)でした
・コールバック(CB)以外にタスク機能(TCB)を追加しました
・ソースコードをダウンロード用Gitサーバ(GitBucket)にアップしました
2018/10/24
・ソース公開
・バグといろいろな問題より中断
環境
IDE:Visual Studio 2017 Community
アプリ:nodejs v8.12.0
パッケージ:readline/uuid
マルチタスク
node.js(javascript)は、Promise、async-awaitという非同期処理があります。
これを使用して、node.jsの非同期関数をCのマルチタスク風にプログラムする方法(Javascriptモジュール)です。
特徴
・タスク(TCB)はタスクを管理するクラス・コンストラクタです
・コールバック(CB)は非同期関数、イベントのコールバック関数を管理するクラス・コンストラクタです
・タスク(TCB)とコールバック(CB)間の待ち(wait)と通知(post)
・1タスク(TCB)の複数コールバック(CB)待ち(OR待ち)
・1コールバック(CB)の複数タスク(TCB)待ちと通知方法の選択(待ちタスク全通知と待ちタスク順通知)
・コールバック(CB)の非同期処理キャンセル(cancel)
・コールバック(CB)の遅延(sleep)と次タスク(next)
・コールバック(CB)のセマフォ(semaphore)のP/V操作
・タスク(TCB)間コール(call)
・タスクの切り替えは優先順位無しのラウンドロビンです(当前?ですがタイムスライス無しです)
・コールバック(CB)の待ちタスクへの通知(post)は一過性です(フラグなどの状態を持ちません)
ソースコード
ソースコードは下記のサイトにあります。
http://u-iwasaki.com:8080/gitbucket/git/bbfactory/node-task.git

このページの「Dawnload Zip」よりダウンロード、任意のフォルダに解凍してください。
%このページはダウンロード専用です
%このサイトはhttps未対応です
主なファイル
・task.js
マルチタスクのJavascriptモジュールです。
バージョンは0.0.1α版です。
・task-test01-main.js
コンソール入力とタイマーの複数待ちのタスク(main関数)と秒をカウントするタスク(count関数)のサンプルです。
・task-test02-post.js
通知待ちの2つのタスク(task1,tasku2関数)に定周期に通知するタスク(main関数)のサンプルです。
通知方法(待ちタスク全通知と待ちタスク順通知)の選択より動きが変わります。
・task-test03-semaphore.js
サンプル(task-test02-post.js)の各関数(main,task1,task2関数)のコンソール出力を複数行にして、そのコンソール関係をセマフォの相互排除(ロック)により同期させるサンプルです。
・task-test04-call.js
サンプル(task-test03-semaphore.js)に現在時刻を読み込むコールタスク(time関数)を追加して、各関数(main,task1,task2関数)よりコールタスク(time関数)を呼び出すサンプルです。
・task-test05-main.js
サンプル(task-test01-main.js)にタイムアウトコールバック((cbTimeout))とキャンセル(cancel)処理を追加。
カウントタスク(count関数)が20秒以上経過するとメインタスク(main関数)が終了します。
マルチタスクモジュール(task.js)の説明
task.jsのバージョンは0.0.1のα版で、新しい関数を作成中です。
まだ仕様が固まっていない関数がありますので、これが落ち着いたら別ページにアップする予定です。
非同期処理のキャンセル
2つの完了(処理要求->必ず正常かエラーでコールバックされる)する非同期関数を同時に実行したとします。
1つの非同期関数が完了(コールバック)した段階で、もう一方の実行中の非同期処理をキャンセルする必要がある場合があります。
タイマーではclearTimeout,clearIntervalなどのキャンセルする関数がありますが、他の非同期関数のキャンセル方法がよく分りません。(javascript,node.jsは勉強中です・・・)
そのため、非同期関数が完了することを前提に、キャンセルする場合は、その関数のコールバック関数を無効化(コールバックされても何もしない)し、新しいコールバック関数を作成、古いコールバック関数と入れ替え、古いコールバック関数への参照を解消しています。古いコールバック関数(オブジェクト)の開放は非同期関数側とガーベージコレクション(GC)に委ねます。
これでも完全ではなくタイミングによっては、また、コンソール入力(readline)などでこれを実行し続けるとメモリリークが発生します。
もしかすると、キャンセル処理は、もともとのJavascriptかPromise、async-awaitでサポートされているかもしれませんが、念のためです。(ホントに勉強中です・・・)
利点
マルチタスクモジュール(task.js)は、急いでいたり、テストなどの簡単でシーケンシャルなプログラムを作成するのに便利だと思います。