更改 multiprocessing.Queue 中的缓冲区大小

2024-02-09

所以我有一个生产者和消费者通过无限大小的队列连接的系统,但是如果消费者重复调用 get 直到抛出 Empty 异常,它不会清除队列。

我相信这是因为一旦套接字缓冲区已满,消费者端队列中将对象序列化到套接字中的线程就会被阻塞,因此它会等待直到缓冲区有空间,但是,对于消费者来说这是可能的调用 get“太快”,因此它认为队列为空,而实际上另一侧的线程有更多数据要发送,但无法足够快地序列化它以防止套接字对消费者显示为空。

我相信如果我可以改变底层套接字上的缓冲区大小(我是基于Windows的),这个问题将会得到缓解。据我所知,我需要做的事情是这样的:

import multiprocessing.connections as conns
conns.BUFSIZE = 2 ** 16 # is typically set as 2 ** 13 for windows
import multiprocessing.Queue as q

如果我执行上述操作,这是否意味着当 multirprocssing 初始化队列时,它将使用我在已导入的 multiprocessing.connections 版本中设置的新缓冲区大小?那是对的吗?

另外我相信这只会影响 Windows,因为 BUFSIZE 在 Linux 机器上不使用,因为它们的所有套接字默认设置为 60 KB?

以前有人尝试过这个吗?这会对 Windows 产生副作用吗? Windows 上套接字缓冲区大小的基本限制是什么?

==================演示代码示例==================

# import multiprocessing.connection as conn
# conn.BUFSIZE = 2 ** 19
import sys
import multiprocessing as mp
from Queue import Empty
from time import sleep

total_length = 10**8

def supplier(q):
    print "Starting feeder"
    for i in range(total_length) :
        q.put(i)


if __name__=="__main__":

    queue = mp.Queue()

    p = mp.Process(target=supplier, args=(queue,))

    p.start()

    sleep(120)

    returned = []
    while True :
        try :
            returned.append(queue.get(block=False))
        except Empty :
            break

    print len(returned)
    print len(returned) == total_length

    p.terminate()
    sys.exit()

该示例在 Windows 上运行时,通常只会从队列中提取大约 160,000 个项目,因为主线程清空缓冲区的速度比供应商重新填充缓冲区的速度更快,并且最终当缓冲区为空时,它会尝试从队列中提取数据,并且报告说它是空的。

理论上,您可以通过更大的缓冲区大小来改善这个问题。我相信,在 Windows 系统上,顶部的两行将增加管道的默认缓冲区大小。

如果您对它们进行评论,那么该脚本将在退出之前提取更多数据,因为它的 .我的主要问题是: 1)这真的有效吗? 2)有没有办法让这段代码在windows和linux中使用相同大小的底层缓冲区 3) 为管道设置较大的缓冲区大小是否会产生任何意外的副作用。

我知道,一般来说,没有办法知道您是否已从队列中提取所有数据(- 考虑到供应商永久运行并产生非常不均匀的数据),但我正在寻找改进方法尽力而为的基础。


Update:

Windows Pipe 的有用链接,供将来需要它的人使用(该链接由 OP 提供,菲尔_20686 https://stackoverflow.com/users/2882136/phil-20686): https://msdn.microsoft.com/en-us/library/windows/desktop/aa365150(v=vs.85).aspx https://msdn.microsoft.com/en-us/library/windows/desktop/aa365150(v=vs.85).aspx

原来的:

BUFSIZE 仅在平台为 win32 时才起作用。

multiprocessing.Queue 构建在 Pipe 之上,如果更改 BUFSIZE,生成的 Queue 将使用更新后的值。见下文:

class Queue(object):

    def __init__(self, maxsize=0):
        if maxsize <= 0:
            maxsize = _multiprocessing.SemLock.SEM_VALUE_MAX
        self._maxsize = maxsize
        self._reader, self._writer = Pipe(duplex=False)

当平台为win32时,Pipe代码将调用以下代码:

def Pipe(duplex=True):
    '''
    Returns pair of connection objects at either end of a pipe
    '''
    address = arbitrary_address('AF_PIPE')
    if duplex:
        openmode = win32.PIPE_ACCESS_DUPLEX
        access = win32.GENERIC_READ | win32.GENERIC_WRITE
        obsize, ibsize = BUFSIZE, BUFSIZE
    else:
        openmode = win32.PIPE_ACCESS_INBOUND
        access = win32.GENERIC_WRITE
        obsize, ibsize = 0, BUFSIZE

    h1 = win32.CreateNamedPipe(
        address, openmode,
        win32.PIPE_TYPE_MESSAGE | win32.PIPE_READMODE_MESSAGE |
        win32.PIPE_WAIT,
        1, obsize, ibsize, win32.NMPWAIT_WAIT_FOREVER, win32.NULL
        )

你可以看到,当duplex为 False,输出缓冲区大小为 0,输入缓冲区大小为 BUFSIZE。

inbuffer 是为输入缓冲区保留的字节数。 2**16=65536,是一次操作可以无阻塞写入的最大字节数,但是不同系统的缓冲区大小的容量不同,即使在同一个系统上也不同,所以很难说侧面当您将 Pipe 设置为最大数量时的效果。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

更改 multiprocessing.Queue 中的缓冲区大小 的相关文章

  • 使 django 服务器可以在 LAN 中访问

    我已经安装了Django服务器 可以如下访问 http localhost 8000 get sms http 127 0 0 1 8000 get sms 假设我的IP是x x x x 当我这样做时 从同一网络下的另一台电脑 my ip
  • OpenCV Python cv2.mixChannels()

    我试图将其从 C 转换为 Python 但它给出了不同的色调结果 In C Transform it to HSV cvtColor src hsv CV BGR2HSV Use only the Hue value hue create
  • Python(Selenium):如何通过登录重定向/组织登录登录网站

    我不是专业程序员 所以请原谅任何愚蠢的错误 我正在做一些研究 我正在尝试使用 Selenium 登录数据库来搜索大约 1000 个术语 我有两个问题 1 重定向到组织登录页面后如何使用 Selenium 登录 2 如何检索数据库 在我解决
  • 使用带有关键字参数的 map() 函数

    这是我尝试使用的循环map功能于 volume ids 1 2 3 4 5 ip 172 12 13 122 for volume id in volume ids my function volume id ip ip 我有办法做到这一点
  • Django:按钮链接

    我是一名 Django 新手用户 尝试创建一个按钮 单击该按钮会链接到我网站中的另一个页面 我尝试了一些不同的例子 但似乎没有一个对我有用 举个例子 为什么这不起作用
  • 使用 matplotlib 绘制时间序列数据并仅在年初显示年份

    rcParams date autoformatter month b n Y 我正在使用 matpltolib 来绘制时间序列 如果我按上述方式设置 rcParams 则生成的图会在每个刻度处标记月份名称和年份 我怎样才能将其设置为仅在每
  • Flask 会话变量

    我正在用 Flask 编写一个小型网络应用程序 当两个用户 在同一网络下 尝试使用应用程序时 我遇到会话变量问题 这是代码 import os from flask import Flask request render template
  • Python pickle:腌制对象不等于源对象

    我认为这是预期的行为 但想检查一下 也许找出原因 因为我所做的研究结果是空白 我有一个函数可以提取数据 创建自定义类的新实例 然后将其附加到列表中 该类仅包含变量 然后 我使用协议 2 作为二进制文件将该列表腌制到文件中 稍后我重新运行脚本
  • Python 函数可以从作用域之外赋予新属性吗?

    我不知道你可以这样做 def tom print tom s locals locals def dick z print z name z name z guest Harry print z guest z guest print di
  • 如何加速Python中的N维区间树?

    考虑以下问题 给定一组n间隔和一组m浮点数 对于每个浮点数 确定包含该浮点数的区间子集 这个问题已经通过构建一个解决区间树 https en wikipedia org wiki Interval tree 或称为范围树或线段树 已经针对一
  • 从 Flask 访问 Heroku 变量

    我已经使用以下命令在 Heroku 配置中设置了数据库变量 heroku config add server xxx xxx xxx xxx heroku config add user userName heroku config add
  • 在Python中获取文件描述符的位置

    比如说 我有一个原始数字文件描述符 我需要根据它获取文件中的当前位置 import os psutil some code that works with file lp lib open path to file p psutil Pro
  • Pygame:有没有简单的方法可以找到按下的任何字母数字的字母/数字?

    我目前正在开发的游戏需要让人们以自己的名义在高分板上计时 我对如何处理按键有点熟悉 但我只处理过寻找特定的按键 有没有一种简单的方法可以按下任意键的字母 而不必执行以下操作 for event in pygame event get if
  • 如何在Python中对类别进行加权随机抽样

    给定一个元组列表 其中每个元组都包含一个概率和一个项目 我想根据其概率对项目进行采样 例如 给出列表 3 a 4 b 3 c 我想在 40 的时间内对 b 进行采样 在 python 中执行此操作的规范方法是什么 我查看了 random 模
  • 将图像分割成多个网格

    我使用下面的代码将图像分割成网格的 20 个相等的部分 import cv2 im cv2 imread apple jpg im cv2 resize im 1000 500 imgwidth im shape 0 imgheight i
  • 解释 Python 中的数字范围

    在 Pylons Web 应用程序中 我需要获取一个字符串 例如 关于如何做到这一点有什么建议吗 我是 Python 新手 我还没有找到任何可以帮助解决此类问题的东西 该列表将是 1 2 3 45 46 48 49 50 51 77 使用
  • 有人用过 Dabo 做过中型项目吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我们正处于一个新的 ERP 风格的客户端 服务器应用程序的开始阶段 该应用程序是作为 Python 富客户端开发的 我们目前正在评估 Dabo
  • Python 类继承 - 诡异的动作

    我观察到类继承有一个奇怪的效果 对于我正在处理的项目 我正在创建一个类来充当另一个模块的类的包装器 我正在使用第 3 方 aeidon 模块 用于操作字幕文件 但问题可能不太具体 以下是您通常如何使用该模块 project aeidon P
  • 如何使用 Pycharm 安装 tkinter? [复制]

    这个问题在这里已经有答案了 I used sudo apt get install python3 6 tk而且效果很好 如果我在终端中打开 python Tkinter 就可以工作 但我无法将其安装在我的 Pycharm 项目上 pip
  • NotImplementedError:无法将符号张量 (lstm_2/strided_slice:0) 转换为 numpy 数组。时间

    张量流版本 2 3 1 numpy 版本 1 20 在代码下面 define model model Sequential model add LSTM 50 activation relu input shape n steps n fe

随机推荐

  • 如何使用命令行将 TFS 工作项链接到另一个工作项

    如何使用命令提示符将现有 TFS 工作项链接到另一个工作项 TFS 中有此命令行选项吗 我知道我可以使用 tfpt exe 创建工作项或修改它 但我找不到将工作项链接到另一个工作项的选项 假设您将使用 相关 链接类型 这应该链接您的工作项目
  • 查找连续的两行

    我正在尝试编写一个查询 该查询将从 Bill 表中拉回 Estimated 标志为 true 的最新两行 问题是这些需要是连续的账单 简而言之 如果在过去两个账单周期中估算了账单 我需要在另一个表中输入一行 如果可能的话 我想在没有游标的情
  • PHP/CSS 在字符串中查找单词,更改其颜色

    PHP CSS 在字符串中查找单词 更改其显示颜色 遇到问题 找不到解决方案 有什么建议吗 谢谢 pre span style color red span pre
  • 将变量类型的 json 转换为字符串

    我正在从 API 响应中读取 json 但遇到了一个问题 因为 json 值中有多种数据类型 字符串 null bool 此外 某些键的值可以是字符串或 null 这使得将数据读入类型变得更加困难 我想将所有内容都转换为字符串以便于处理 我
  • .net 应用程序无法连接到 DB2 数据库

    错误 08001 IBM SQL30081N 检测到通信错误 使用的通信协议 TCP IP 使用的通信 API SOCKETS 检测到错误的位置 10 66 180 30 通信功能检测到错误 连接 协议特定错误代码 10061 SQLSTA
  • 忽略 Cordova iOS 启动画面配置

    我刚刚将我的 iOS Cordova 初始屏幕重新配置为启动 Storyboard 以支持 iPhone X 这可行 但现在我在启动 Storyboard 和应用程序的第一个屏幕之间出现白色闪光 我认为这是因为在视口完全加载之前闪屏被隐藏
  • 如何在 ASP.NET 中使用 Profile?

    我尝试学习 asp net 配置文件管理 但我在下面添加了 xml 名字 姓氏等 但我不能写个人资料 如果我尝试编写 Profile 属性 卓尔我的编辑简介 错误 1 当前上下文中不存在名称 配置文件 C Documents and Set
  • 根据 GUID 获取站点 URL? (SharePoint)

    有没有代码示例向我展示如何在我知道 guid 的情况下获取站点的 url 目前 我有此代码来获取网站集中的所有网站 private void getSites SPSite oSiteCollection SPContext Current
  • 如何将“for”循环的结果保存到单个变量中? [复制]

    这个问题在这里已经有答案了 我有一个for loop for x in range 1 13 print This was the average temperature in month number str x in Boston 20
  • jQuery Chosen div 落后于 Twitter Bootstrap 手风琴

    我在 Twitter Bootstrap 手风琴中使用 jQuery Chosen 插件 我遇到的问题是所选插件的下拉菜单出现在div的手风琴菜单 我尝试设置z index到更高的值 但这并没有达到目的 我举了一个我的问题的例子 http
  • VBScript WScript.Shell Run() - 系统找不到指定的文件

    我正在尝试编写一个使用 WScript Shell 的 VBScript vbs 脚本Run 方法 但 Run 似乎找不到我传入的文件 我已将脚本简化为以下代码 该代码将重现结果 可以将其复制到文本编辑器 另存为test vbs然后跑了 T
  • scikit-learn中predict与predict_proba的区别

    假设我创建了一个模型 并且我的目标变量是0 1 or 2 看来如果我使用predict 答案是 0 1 或 2 但是如果我使用predict proba 我得到一行 每行 3 列 如下所示 例如 model Classifier It co
  • 动态 JSP 编译中导入失败

    我们有一个大型 Web 应用程序安装 使用 Apache Tomcat Jasper 和 jboss 在开发环境中 JSP 是动态编译的 不幸的是 有一个包特别是即时编译似乎无法导入 对于某些类 使用完全限定的引用而不是导入是可行的 但不适
  • Masonry JS 重叠项目

    我这里有一个非常奇怪的问题 推荐链接已删除 第一行产品项目与第二行中的项目重叠 砌体项目位于主页下方页脚上方 如您所见 Chrome 看起来有所不同 在火狐浏览器中 看起来不错 这是它在我的 chrome 中的样子 http clip2ne
  • Python属性错误:类型对象'_socketobject'没有属性'gethostbyname'

    我正在尝试在我的程序中执行此操作 dest socket gethostbyname host 我已经包括了这一行 from socket import 在文件的开头 我收到此错误 属性错误 类型对象 socketobject 没有属性 g
  • 在控制台中更改 Google Cloud Compute Engine 实例的内部静态 IP 地址

    我有一个现有的云计算引擎实例 该实例被错误地分配了错误的静态内部 IP 我无法找到使用控制台或其他方式将内部 IP 地址修改为正确值的方法 我尝试保留一个新的静态内部 IP 这很容易 但无法将其分配给现有资源 我说的是 Google Con
  • numpy.digitize 返回的值超出范围?

    我使用以下代码将数组数字化为 16 个容器 numpy digitize array bins numpy histogram array bins 16 1 我预计输出在 1 16 范围内 因为有 16 个 bin 然而 返回数组中的一个
  • 如何在Matlab中的多维数组中应用corr2函数?

    假设我有两个矩阵 A 和 B A rand 4 5 3 B rand 4 5 6 我想应用函数 corr2 来计算相关系数 corr2 A 1 B 1 corr2 A 1 B 2 corr2 A 1 B 3 corr2 A 1 B 6 co
  • Android:java.io.IOException:主机名未验证

    运行我的应用程序时出现 java io IOException 主机名未验证 我该如何解决它 java io IOException Hostname 178 61 62 140 was not verified 01 03 16 34 3
  • 更改 multiprocessing.Queue 中的缓冲区大小

    所以我有一个生产者和消费者通过无限大小的队列连接的系统 但是如果消费者重复调用 get 直到抛出 Empty 异常 它不会清除队列 我相信这是因为一旦套接字缓冲区已满 消费者端队列中将对象序列化到套接字中的线程就会被阻塞 因此它会等待直到缓