terurouメモスマートフォン用の表示で見るterurouメモこの広告は、90日以上更新していないブログに表示しています。Component)コンパイラをNode.jsで実装して、マクロから呼び出してコード生成するということをやっていた。このエントリーを書いている時点では、コンパイラ自体はまだ「とりあえずコードが生成できている」というレベルなのだが、マクロから外部プロセスを起動する部分については知見が溜まってきたのでメモを残す。この記事で使用しているHaxeはv3.4.3である。10でしか動作確認していないが、おそらく他のOSでも挙動は同じになると思われる。次のコードが基本形となる。gist.github.comポイントとしては、sys.io.Processを使う。プロセスの起動確認にstdoutを読み込んでいる。これはstdoutが読めるまでブロッキングされる。外部プロセス側で「起動が完了したことが分かる何らかの値」をstdoutに出力しなければならない。プロセスの起動が失敗するなどの要因で、プロセス側からstdoutがクローズされ、終端を読み込むとEofがthrowされてくる。この方法だと、外部プロセス側で処理が完了したら、successfulでもなんでもいいので、なんらかの起動完了を表す文字列をstdoutに出力しなければならない。これがないと、readLine()で処理がブロッキングされてしまう。上記以外に起動確認をする方法としては、リターンコードの確認(process.exitCode())をする方法もある。これもリターンコードが返されるまでブロッキングされる。後述する外部プロセスを常駐化することを考えると、この方法は利用できない。補足として、process.stdoutの読み込みも当然ながらブロッキングされるため、こちらを監視して正常起動を確認するという方式はとることができない。その他注意点プロセス起動は比較的オーバーヘッドが大きいので、マクロ内で何度もプロセス起動をすべきではない。v3)で試した際は、プロセス起動では300msec強かかるのに対して、localhostに対してのHTTPであれば20msec未満でリクエスト処理が完了する。いう実装ではマクロの応答がなくなってしまう問題が発生した。readLine()の場合はデータサイズが大きくても問題は発生していない。原因未調査だが、プロセスが停止されている(=stdoutが閉じられている)状況でもデータのサイズが大きいと応答がなくなってしまうため、Haxeの標準ライブラリ側に問題がある可能性もあり。stdoutでテキストデータのやり取りをする場合、Windows環境では文字エンコーディングの問題が生じる。マクロ側の内部エンコーディングはUTF-8となる。RPCで都度の処理を移譲する返す形に落ち着いた。付与されるようにできる。sys.io.Processは明示的にclose()もしくはkill()しなくても、マクロ終了時にプロセスを停止してくれるのだが、Haxeコンパイラの入力補完機能を利用している場合は事情が異なってくる。この場合は、Haxeコンパイラプロセスが常駐状態になるので、入力補完が走るたびにプロセス起動処理が呼び出され、明示的に外部プロセスをクローズしない限りは起動しっぱなしになる。そのため、マクロ側かプロセス側のどちらかで(できれば両側で)多重起動を防止するコードが必要となる。マクロ側で対応する場合は、単純にsingletonとして処理すれば十分である。追記:Haxeコンパイラの入力補完サービスの場合、Haxeコンパイラプロセスが停止しても起動した外部プロセスは停止されないようだ。これは明示的にハンドリングする方法がないようなので、ある程度お行儀をよくするには、外部プロセス側で一定期間利用されていなければ自動終了させるような仕組みを入れるしかないと思われる。18:30Haxeのマクロで外部プロセスに処理を移譲する場合の知見Tweet広告を非表示にする関連記事2018-03-30HaxeのUnitTestライブラリ(2018年版)2018年におけるHaxeのUnitTestライブラリについて書く。(69)月別アーカイブはてなブログをはじめよう!terurouさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。