1
我從Python線程中產生了一個Node進程,並通過stdio在它們之間傳遞數據。在Python將某些內容發送給Node後,Node會啓動一個子進程,然後將該子進程的輸出發送回Python。通過stdio在Node.js和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()
- 我試過,與重生()調用,標準輸入輸出: '繼承'
- 我試着等待「漏'發送更多數據之前的事件。
看來,輸出緩衝。這可能有助於防止緩衝:http://stackoverflow.com/questions/6471004/how-can-i-write-blocking-in-stdout-with-node-js – 2012-07-26 13:14:36
這似乎沒有什麼差別,以及實際上它加劇了這個問題。 只有一條線通過而不是三條,當然現在沒有什麼東西可以通過(因爲沒有緩衝)而被殺死。 – Xavura 2012-07-26 13:21:29
似乎我仍然有stdio:'繼承'。刪除後,我得到:EBADF - 錯誤的文件描述符。編輯:如果運行立體,我明白了。如果從Python內部運行,則不會出錯,但不會輸出。 – Xavura 2012-07-26 13:28:17