python的匿名管道爆了怎麼辦

2021-10-17 03:16:13 字數 1843 閱讀 1153

最近使用了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容量的硬...