通过“with”语句使用 Python 队列

2024-01-31

有没有使用Python的标准方法Queue in a with陈述?这就是我希望能够使用它的方式:

import Queue
myqueue = Queue.Queue()
...
...
...
with myqueue as nextItem:
    doStuff(nextItem)

没有__enter__ or __exit__方法用于Queue对象,所以这不起作用。有没有任何语法糖可以让它看起来比这更好?

import Queue
myqueue = Queue.Queue()
...
...
...
try:
    nextItem = myqueue.get()
    doStuff(nextItem)
finally:
    myqueue.task_done()

Edit:我有两个原因想要使用with在这种情况下的声明。首先,我认为一个with声明将帮助我的代码更干净一点,特别是当不仅仅是单个调用时doStuff。其次,最好有一些简单的东西,我可以养成每次使用的习惯,以确保我永远不会忘记打电话task_done或者存在错误可能导致调用被跳过的情况。


有几个简单的选项可以确保无论如何都会在队列上调用 task_done() 。如果您需要对队列中的某个项目执行的工作很复杂,或者需要对每个项目执行多个代码路径,则这些功能特别有用。

第一个选项特定于队列。它与 Rob 的建议类似,但不需要创建 Queue 的子类。

@contextlib.contextmanager
def mark_done(queue):
    try:
        yield queue.get()
    finally:
        queue.task_done()

queue = Queue()
# assume you put stuff in the queue
with mark_done(queue) as item:
    item.do_stuff()

我喜欢一种更通用的形式,无论何时您想在代码块末尾调用函数,该形式都很有用,并且该函数与块顶部的对象相关:

@contextlib.contextmanager
def defer(func):
    try:
        yield
    finally:
        func()

queue = Queue()
# assume you put stuff in the queue
item = queue.get()
with defer(queue.task_done):
    item.do_stuff()

使用第二种形式需要额外的一行代码,但考虑到可读性,它使上下文管理器将要做什么变得非常清楚。

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

通过“with”语句使用 Python 队列 的相关文章

随机推荐

  • Inno Setup 在appendChild msxml 中崩溃

    我想在 Inno Setup 中修改 xml 文件 但安装程序崩溃了 我尝试了不同的方法 结果得到了有问题的示例代码 procedure testXml var xmlDocLocal nodeLocal Variant begin try
  • 如何锁定具有相同 id 的对象?

    我有以下代码 public void Update Foo foo lock locker UpdateFirstPart foo First UpdateSecondPart foo Second UpdateThirdPart foo
  • 根据python中的条件添加前导零

    我有一个包含 500 万行的数据框 假设数据框如下所示 gt gt gt df pd DataFrame data Random 86 7639103627 96 32 1469476501 split gt gt gt df Random
  • 正则表达式匹配英国邮政编码的前半部分

    我需要一个正则表达式来匹配英国邮政编码的前半部分 并且可能只能传入一半或完整的邮政编码 这里有一个匹配完整邮政编码的好方法 英国邮政编码正则表达式 综合 https stackoverflow com questions 164979 uk
  • 聚合物后退按钮不适用于哈希路由

    赞 后退按钮有时不适用于我的聚合物项目 当我按下后退按钮时page变量是当前页面的钢 我需要按两次或三次按钮才能使其工作 例如我转到 rules页面来自 home但它不会回到 home一旦我第二次或第三次按后退按钮 它就会返回主页 这是我的
  • 如何以管理员权限从 Windows 服务运行程序

    我创建了一个在 Windows 启动时运行程序的 Windows 服务 但使用此解决方案 该程序无需管理员权限即可运行 但是 如果我通过单击 开始 菜单上的程序快捷方式来运行该程序 它将以管理员权限运行 我使用这段代码来运行该程序 Appl
  • 从 RAILS_ROOT 外部运行 rake 任务

    我的 RAILS ROOT 是 usr local www application 如果我从 RAILS ROOT 中运行 rake db migrate RAILS ENV 生产 它就可以正常工作 但是我似乎找不到从 RAILS ROOT
  • 钛金 Android 屏幕方向

    我用 Titanium 制作了一个 Android 应用程序 设备旋转时屏幕也会旋转 如何在 Android 应用程序中停止窗口 屏幕方向 Use android screenOrientation portrait 在 Android M
  • ionic 2 ion-select - 以编程方式关闭选择框

    我正在从事 ionic2 项目 我使用离子选择元件 我搜索一种在选择任何项目时以编程方式关闭选择框的方法 而不是等待用户按 确定
  • 处理无效的 XML 十六进制字符

    我尝试通过网络发送 XML 文档 但收到以下异常 MY LONG EMAIL STRING was specified for the Body element amp gt System ArgumentException x2 hexa
  • 自定义数据集和数据加载器

    我是 pytorch 的新手 我有一个大数据集 由两个 txt 文件组成 一个用于数据 另一个用于目标数据 在训练文件中 每行是长度为 340 的列表 在目标中 每行是长度为 136 的列表 我想问我如何定义我的数据集 以便我可以使用 Da
  • DialogFragment.dismiss 因 NullPointerException 崩溃

    我正在做一些后台工作并在执行此操作时显示 DialogFragment 一旦我的工作完成并调用相关回调 我就会关闭该对话框 当我这样做时 我遇到了由 Android 源中的 NPE 引起的崩溃 如下所示 void dismissIntern
  • 按顺序调用子项目和其他任务的 Gradle 批处理任务

    我正在为多模块项目编写 gradle 1 4 构建文件 所以有根构建 gradle定义如下 subprojects apply plugin java 它定义了build所有子模块的任务 子模块包含在设置 gradle每个模块都有其具有定义
  • 为什么使用 static_cast(x) 而不是 (T)x?

    我听说static cast函数应该优先于 C 风格或简单函数风格的转换 这是真的 为什么 主要原因是经典的 C 类型转换不区分我们所说的static cast lt gt reinterpret cast lt gt const cast
  • PHP 中没有 cookie 的 CSRF 令牌

    我正在寻找一种将 CSRF 令牌添加到我正在制作的应用程序中的方法 需要注意的是 该应用程序当前不使用 cookie 或会话 我很想找到一种引入 CSRF 令牌的方法 而不必 在我的应用程序中引入状态 使用会话或 cookie SESSIO
  • 读取 txt 文件 fscanf 与 fread 与 textscan [重复]

    这个问题在这里已经有答案了 我有一个从 SQL 2005 生成的 txt 文件 ANSI 格式 我努力了textscan and fscanf 整个txt文件只有numeric data 在线资源表明 fscanf 比 textscan 更
  • 获取外部文件目录失败

    OnActivityCreated 我正在做 activity getExternalFilesDir Environment DIRECTORY PICTURES 在 logcat 中我得到 com package W ContextIm
  • 流过滤器的时间复杂度

    我有这样的代码 List
  • 如何在delphi中使用ToastGeneric创建toast通知

    我正在使用 delphi 在桌面上进行开发 我想使用 ToastGeneric 类型通知创建 toast 通知 LToastFactory CreateToastNotification LXMLTemplate 另外 我正在使用 xml
  • 通过“with”语句使用 Python 队列

    有没有使用Python的标准方法Queue in a with陈述 这就是我希望能够使用它的方式 import Queue myqueue Queue Queue with myqueue as nextItem doStuff nextI