2017-05-10 4 views
0

私は、バックエンドデーモンとしてpythonサブプロセスを使用するneovimプラグイン(重要な部分ではありません)を作成しました。私は、標準入力にデータを送信し、標準出力Pythonサブプロセスが高いコンテンツ長でロックアップ

プラグインの

基礎からデータを返すコードが今のよう

ここ

あり、すべてのもののように動作します期待される。しかし、今私は __server_handleが返されたコンテンツの長さが33Kのかなり高いときにロックアップするのを見ています。 In this while block私はstdoutから実際のコンテンツを抽出しようとしていますが、データを返すことはできず、コンテンツの長さでのみロックします。

サブプロセスがロックアップされないようにこれを処理する方がいいでしょうか?

while True: 
     headerline = Client.__server_handle.stdout.readline().strip() 
     linecount += 1 

     if len(headerline): 
      key, value = headerline.split(":", 2) 
      headers[key.strip()] = value.strip() 

      if "Content-Length" not in headers: 
       raise RuntimeError("Missing 'Content-Length' header") 

      contentlength = int(headers["Content-Length"]) 
      returned_string = Client.__server_handle.stdout.read(contentlength) 
      ret = json.loads(returned_string) 

答えて

0

私の推測では、デッドロックにつながる読みしようとしているので、あなたのコードがブロックされている間のパイプは、サブプロセスがブロックされることを、そんなにデータで埋めてしまうことです。

なぜブロック読み取りではなくデータをポーリングしますか?

selectをチェックして、IO完了を待ちます。

+0

ポーリングでは、データが返されるまでプロセスに「ping」するだけでよいのでしょうか?私の懸案事項は、返送されるデータが非同期ではないコード補完用であることです – mhartington