最近使用了python的匿名管道,大體上就是python使用了subproces.popen()起了乙個子程序,主程序與子程序使用匿名管道進行通訊,大體**如下。
# 主程序
import subprocess
from subprocess import pipe
p = subprocess.popen("python3 run.py", shell=false, stdin=pipe, stdout = pipe)
tmp_list = ["jfkdslakfjdslkfj\n", "ienwfjewnufwen\n".......]這裡模擬一大堆輸入
for item in tmp_list:
p.stdin.write(item.encode())
p.stdin.flush()
本來這其實是一段再正常不過的**,只要我輸入一條他讀一條就沒問題,但是寫子程序那個狗日的,他不按照我的輸入輸出規矩行事,管道裡面打進去了資料,他一點也不急,他偏要自己需要多少就拿多少,我不停的輸入,他就看情況拿,這個直接導致了我的管道跑滿**。。。他的程式我就不po了,你只要記得他一直沒有input()就行。大概這個樣子
# 子程序
import subprocess
from subprocess import pipe
tmp_list = ["jfkdslakfjdslkfj\n", "ienwfjewnufwen\n".......]這裡模擬一大堆輸入
for item in tmp_list:
pass #老子就是不幹任何事情
input() #有事情,老子讀一行
...input()#又有事情,老子再讀一行
然後管道越積越多,就**了。。卡在了stdin.write上面。
問題就在於我怎麼增大管道大小
ulimit -a可以檢視管道的大小但是沒有卵用,這個是管道大小,撐爆的是buffer
修改proc/sys/fs/pipe-max-size中的值,發現是1048576也就是大概10m,而一般管道大小是64kb,說明我們還是存在增大空間的
查閱了一下方法,發現c語言使用fcntl修改f_setpipe_sz可以更改當前描述符匿名管道的大小。但我用的是python,有fcntl,但是裡面沒有f_setpipe_sz
多方嘗試,終於找到,沒有f_setpipe_sz就自己定義乙個,至於裡面怎麼做,我也沒有查很清楚,希望高手幫我解答。
最後**如下
# 主程序
import subprocess
import fcntl
from subprocess import pipe
p = subprocess.popen("python3 run.py", shell=false, stdin=pipe, stdout = pipe)
fcntl.f_setpipe_sz = 1031
fcntl.fcntl(fd, fcntl.f_setpipe_sz, 1048576)
tmp_list = ["jfkdslakfjdslkfj\n", "ienwfjewnufwen\n".......]這裡模擬一大堆輸入
for item in tmp_list:
p.stdin.write(item.encode())
p.stdin.flush()
fcntl.f_setpipe_sz = 1031是自定義的乙個值,1031應該代表管道大小,不用擔心python沒有,最終系統裡一定是有的
這種方式管道可以容納大概10mb的輸入,很多情況下夠了。但是裡面具體的原理還是望高手們幫我解答
Python程序間通訊之匿名管道
管道是乙個單向通道,有點類似共享記憶體快取.管道有兩端,包括輸入端和輸出端.對於乙個程序的而言,它只能看到管道一端,即要麼是輸入端要麼是輸出端.os.pipe 返回2個檔案描述符 r,w 表示可讀的和可寫的.示例 如下 usr bin python import time import os def...
Python程序間通訊之匿名管道
管道是乙個單向通道,有點類似共享記憶體快取.管道有兩端,包括輸入端和輸出端.對於乙個程序的而言,它只能看到管道一端,即要麼是輸入端要麼是輸出端.os.pipe 返回2個檔案描述符 r,w 表示可讀的和可寫的.示例 如下 usr bin python import time import os def...
我的硬碟爆了
首先上圖 自己提前感受一下了.既然硬碟沒空間了,就要想辦法解決資料儲存的問題.首先想到的是把我的硬碟進行一下碎片整理,聽說用ultradefrag不錯,用了一下,雖然分析碎片很快,可是整理起來就不是那麼快了,網上有人說 碎片整理的速度主要取決於分割槽占用的大小和碎片的多少,磁碟碎片整理 1t容量的硬...