トップ «前の日記(12/16/2008) 最新 次の日記(12/20/2008)» 編集

本 日 の h o g e

hogeとはワイルドカードのようなものです。日々起こった、さまざまなこと −すなわちワイルドカード− を取り上げて日記を書く、という意味で名付けたのかというとそうでもありません。適当に決めたらこんな理由が浮かんできました。

更新情報の取得には rdflirs を使ってもらえると嬉しいです.


12/18/2008 むう [長年日記]

tDiary 2247日目

[Py] subprocess.Popen

って,何も考えずにテキトーに使うとデッドロックするのか... ってもしかして使い方間違ってる?

from subprocess import Popen, PIPE

p = Popen(['/bin/cat'], executable='/bin/cat',
          stdin=PIPE, stdout=PIPE)

p.stdin.write('a' * (65536 * 2))
p.stdin.write('\n')

これで再現. もちろん os.write を使っても一緒.

strace とかかましてみれば分かるけど, python も cat もパイプへの書き込みでブロック. まあ当然と言えば当然なんだけど.

しかしこれを回避するために自前で select とか, 何か subprocess のうまみが半減してる気がするよなあ... ってまあそれしか思いつかん以上やるしかないのだけれど.

いけてねー.

うーん

subprocess - Subprocess management - Python v2.6.1 documentation

Warning: Use communicate() rather than stdin.write(), stdout.read() or stderr.read() to avoid deadlocks due to any of the other OS pipe buffers filling up and blocking the child process.

そう言われてもねえ.

子プロセスに渡したいデータが断続的に発生するものだったらどうすんのさ. それがバッファできるほど小さくないデータだったらどうすんのさ.