subprocess.Popen()を使ってCプログラムを実行し、そのストリームをリアルタイムで出力してクライアントに送信します。ただし、出力はバッファリングされ、実行の最後に一緒に送信されます(ブロッキングの性質)。リアルタイムで出力を受け取って、Twisted Autobahnで即時に送信するにはどうすればいいですか?Twisted [autobahn] websocketサーバーでリアルタイムに出力をストリームする方法は?
def onConnect(self, request):
try:
self.cont_name = ''.join(random.choice(string.lowercase) for i in range(5))
self.file_name = self.cont_name
print("Connecting...")
except Exception:
print("Failed"+str(Exception))
def onOpen(self):
try:
print("open")
except Exception:
print("Couldn't create container")
def onMessage(self, payload,isBinary=False):
cmd = "docker exec "+self.cont_name+" /tmp/./"+self.file_name
a = subprocess.Popen([cmd], shell=True, stdout=subprocess.PIPE, bufsize=1)
for line in iter(a.stdout.readline, b''):
line = line.encode('utf8')
self.sendMessage(line)
def onClose(self, wasClean, code, reason):
try:
print("Closed container...")
except Exception:
print(str(Exception))
サブプロセスを使用してdockerコマンドを実行すると、cコードの出力全体が発生するのではなく、すぐに返されます。例:
これをコンテナで実行した後、プログラムはクライアントに3秒後に 'Rounded'を返します。ただし、実行終了時にすべての丸められた送信を終了します。
あなたの質問は、あなたが持っている問題がどこにあるのか、それを過ぎるのに役立つだろうかということは、広くは分かりませんが、いくつかのサンプルコードを含めることができますか?好ましくは、http://sscce.org/の行に沿って何かがあります。 –
@ Jean-PaulCalderone私はいくつかのコードを追加しました。それを見てください。ありがとう –