如果一系列命令在Linux中進行管道傳輸,則它可以高效地處理它,即。如果最後一個子進程已經終止,它會終止前一個子進程。例如,如何在python子進程的巨大輸入上處理管道「head」?
cat filename | head -n 1
zcat filename | head -n 1
hadoop fs -cat /some/path | head -n 1
在上述每一項中,cat命令都需要相當長的時間,但組合命令執行速度很快。它是如何在內部完成的?第一個命令(cat
命令)在head
終止後立即由OS給出SIGTERM,SIGKILL?
我想在Python中做類似的事情,並想知道應該做什麼最好的方法。我正在嘗試執行以下操作:
p1 = Popen(['hadoop','fs','-cat',path], stdout=PIPE)
p2 = Popen(['head','-n',str(num_lines)], stdin=p1.stdout,stdout=PIPE)
p2.communicate()
p1.kill() or p1.terminate()
這是否有效?
爲什麼使用'head'?你可以直接在python中讀取來自p1.stdout的行。看到這個問題:http://stackoverflow.com/questions/1767513/read-first-n-lines-of-a-file-in-python – jbaiter
@jbaiter:同意但仍然沒有回答這個問題。我可能沒有使用'head'並從p1.stdout中讀取,但是我想知道的是,一旦我讀取了所需的行數,是否安全地使用p1.kill()或p1.terminate() ?有更多優雅的方法來實現同樣的目標嗎? –