1

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' を試しました
  • さらにデータを送信する前に、「ドレイン」イベントを待ってみました。
4

1 に答える 1