Python スレッド内から Node プロセスを生成し、それらの間で stdio を介してデータを渡しています。Python が Node に何かを送信した後、Node は子プロセスを起動し、その子プロセスからの出力を Python に送り返します。
これは数秒間機能し、その後データが来なくなります。ただし、Node プロセスを強制終了すると、突然すべてのデータが一度に取得されます。
これはバッファリングに関係していると思いますが、非常に多くのことを試しましたが、適切に機能させることができません。
Python の外部でモニターを実行すると正常に動作するため、これはおそらく Python 側の問題です。
関連する Python コード:
class MonitorThread(Thread):
# *snip*
def run(self):
self.process = Popen(['node',
path.join(PACKAGE_PATH 'monitor.js')],
stdout=PIPE, stdin=PIPE, stderr=PIPE)
while self.process.poll() is None:
stdout = self.process.stdout.readline().rstrip('\n')
if stdout:
main_thread(debug, stdout)
stderr = self.process.stderr.readline().rstrip('\n')
if stderr:
main_thread(debug, stderr)
#time.sleep(0.1)
関連する Node.js コード (CoffeeScript の場合ですが、知らなくてもわかります):
# *snip*
child = spawn cmd, options
child.stdout.on 'data', (data) ->
process.stdout.write "stdout: #{data.toString().trim()}\n"
child.stderr.on 'data', (data) ->
process.stdout.write "stderr: #{data.toString().trim()}\n"
他にもたくさんのコードがありますが、実際には関係ありません。データが送信され、その後データが受信されます。ほんの一瞬だけです。手動で強制終了すると、残りのデータが突然表示されるため、まだ実行されています。
Monitor [send] - {"wrap": false, "directories": {"src": "lib"}, "id": 0, "base_dir": "C:\\Users\\Joe\\Documents\\GitHub\\CoffeeScript-Sublime-Plugin"}
Monitor [recv] - 13:55:30 - compiled src\a.coffee
Monitor [recv] - path.exists is now called `fs.exists`.
Monitor [recv] - 13:55:30 - compiled src\b.coffee
- 私は util.pump() を試しました
- spawn() 呼び出しで stdio: 'inherit' を試しました
- さらにデータを送信する前に、「ドレイン」イベントを待ってみました。