【发布时间】:2017-12-22 05:29:50
【问题描述】:
我正在寻找关于 Python 中队列实现的更多见解,而不是在文档中找到的。
根据我的理解,如果我在这方面错了,请原谅我的无知:
queue.Queue():通过内存中的基本数组实现,因此不能在多个进程之间共享,但可以在线程之间共享。到目前为止,一切顺利。
multiprocessing.Queue():通过具有大小限制的管道 (man 2 pipes) 实现(相当小:在 Linux 上,man 7 pipe 表示 65536 未调整):
从Linux 2.6.35开始,默认管道容量为65536字节,但可以使用
fcntl(2)F_GETPIPE_SZ和F_SETPIPE_SZ操作查询和设置容量
但是,在 Python 中,每当我尝试将大于 65536 字节的数据写入管道时,它都会毫无例外地工作 - 我可能会以这种方式淹没我的内存:
import multiprocessing
from time import sleep
def big():
result = ""
for i in range(1,70000):
result += ","+str(i)
return result # 408888 bytes string
def writequeue(q):
while True:
q.put(big())
sleep(0.1)
if __name__ == '__main__':
q = multiprocessing.Queue()
p = multiprocessing.Process(target=writequeue, args=(q,))
p.start()
while True:
sleep(1) # No pipe consumption, we just want to flood the pipe
所以这是我的问题:
Python 是否调整了管道限制?如果是,多少?欢迎使用 Python 源代码。
Python 管道通信是否可以与其他非 Python 进程互操作?如果是,欢迎使用工作示例(最好是 JS)和资源链接。
【问题讨论】:
-
您可以查看模块的代码 :) 了解事物如何工作的最佳方式,并查看好的 python 代码。
-
Louis 绝对是一个彻底的回答,关于最后一部分,如果您对 2 个程序之间的通信(无论它们的语言)感兴趣,您可能想看看实现 AMQP protocol 的经纪人(rabbitmq、zeromq...等)。
-
当您需要每秒执行数千次调用时,消息代理比直接文件描述符消耗慢很多......因此对python的数据格式互操作性感兴趣(我怀疑它“腌制”对象...)