让 python 生成器在后台运行

2023-11-30

现在我有一些代码大致执行以下操作

def generator():

    while True:
        value = do_some_lengthy_IO()
        yield value 

def model():

    for datapoint in generator():
        do_some_lengthy_computation(datapoint)

Right now, the I/O and the computation happen in serial. Ideally the should be running in parallel concurrently (the generator having ready the next value) since they share nothing but the value being passed. I started looking into this and got very confused with the multiprocessing, threading, and async stuff and could not get a minimal working example going. Also, since some of this seems to be recent features, I am using Python 3.6.


我最终弄清楚了。最简单的方法是使用multiprocessing封装并使用管道与子进程通信。我写了一个可以接受任何生成器的包装器

import time
import multiprocessing

def bg(gen):
    def _bg_gen(gen, conn):
        while conn.recv():
            try:
                conn.send(next(gen))
            except StopIteration:
                conn.send(StopIteration)
                return

    parent_conn, child_conn = multiprocessing.Pipe()
    p = multiprocessing.Process(target=_bg_gen, args=(gen, child_conn))
    p.start()

    parent_conn.send(True)
    while True:
        parent_conn.send(True)
        x = parent_conn.recv()
        if x is StopIteration:
            return
        else:
            yield x

def generator(n):
    for i in range(n):
        time.sleep(1)
        yield i

#This takes 2s/iteration
for i in generator(100):
    time.sleep(1)

#This takes 1s/iteration
for i in bg(generator(100)):
    time.sleep(1)

现在唯一缺少的是,对于无限生成器,该进程永远不会被终止,但可以通过执行以下操作轻松添加parent_conn.send(False).

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

让 python 生成器在后台运行 的相关文章

随机推荐

  • 使用 VBA for Excel 从大范围单元格中删除“额外”空格(超过 1 个)的更快方法

    如何从包含文本字符串的大范围单元格中更快地删除多余空格 假设有 5000 个细胞 我尝试过的一些方法包括 For Each c In range c Value Trim c Value Next c and For Each c In r
  • 你会如何解析 Markdown? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 编辑 我最近了解了一个名为
  • C# 停止执行直到事件发生

    我需要停止执行程序 直到用户单击按钮 我正在进行离散事件模拟 现在的目标是提供简单的图形来说明情况 当模拟达到值得展示的事件时 将调用绘制情况的方法 我需要该方法在用户单击按钮之前不跳回到模拟核心 只有在到达有趣的点时才再次调用 您可以创建
  • ANTLR 中的浮点文字和范围参数

    我正在开发 D 语言的解析器 当我尝试添加 切片 运算符规则时遇到了麻烦 你可以找到它的ANTLR语法here 基本上问题是 如果词法分析器遇到这样的字符串 1 2 它就会完全丢失 并且最终成为单个浮点值 因此像 a 10 这样的字符串的后
  • 对现有文件多次运行 blob 存储触发器

    我一直在使用一种方法 通过进入我的存储帐户并删除 azure webjobs host gt blobreceipts gt 函数应用程序名称 中找到的 blob 对相同文件多次运行存储触发器 gt Blob 触发器名称 我认为这就是我需要
  • 从 YouTube 数据 API 搜索查询中排除直播活动

    我正在使用 google api php client https github com google google api php client 仅搜索和检索 YouTube 上的视频 我知道您可以将名为 type 的查询标记设置为视频
  • “运算符不存在:整数=?”使用 Postgres 时

    我有一个简单的 SQL 查询 在 go 的 database sql 包提供的 QueryRow 方法中调用 import github com codegangsta martini github com martini contrib
  • 场景和步骤“获取最后更改”问题

    我有下表抽象了一些场景及其步骤 按 START DATE desc 排序 SCENARIO KEY STEP KEY START DATE END DATE PREVIOUS SCENARIO KEY PREVIOUS STEP KEY 1
  • 如何使用java流从网络获取PDF文件

    例如 我需要从网络下载 PDF 文件http www math uni goettingen de zirkel loesungen blatt15 loes15 pdf这个链接 我必须使用 Streams 来做到这一点 对于图像 它对我来
  • 根据角色显示不同的视图控制器-Firebase、Swift 3

    我正在构建一个非常简单的应用程序 它将用户的报告发送给管理员 到目前为止我已经完成了整个前端 我的菜单可以正常工作 报告顺序也很流畅 现在是我负责后端的时候了 我是一名新的 Swift 开发人员 完全自学 就像你应该的那样 但我对一些事情感
  • BLE 广告 RawData - 如何解码?

    我有一个连接到网关的 E66 健身手环 该手环确实连接到网关 并且我通过 MQTT 接收数据 但我不确定如何解码 RawData 格式 有人可以帮助我吗 谢谢 TimeStamp 2020 05 30 16 44 32 DataFormat
  • 为什么 cpu 性能计数器一直报告 0% cpu 使用率?

    PerformanceCounter cpuload new PerformanceCounter cpuload CategoryName Processor cpuload CounterName Processor Time cpul
  • 使用 ArrayAdapter 在自定义列表视图中滚动时微调器重置值

    我是 android 初学者 我需要你的帮助 在我的应用程序中 我使用自定义适配器和自定义行布局创建了一个列表视图 我成功地做到了这一点 并且我在所有行中添加了一张图像 文本视图和一个旋转下拉菜单 下拉列表中有项目数量 例如从 0 到 9
  • 在循环内定义的Java变量在循环外似乎无法被识别?

    我有一段代码令我困惑 我在 if else 语句内定义了一个整数数组 因为数组的长度取决于该方法的 2 个输入的长度 我的问题是 在 if else 语句之外 变量定义似乎丢失了 import java util Arrays public
  • 嵌入式.mobileprovision 中的 ProvisionsAllDevices 与 ProvisionedDevices

    我最近收到了一个 ipa 文件形式的 ipad 应用程序 为了安装该应用程序 我将其重命名为 zip 并找出应用程序文件并使用 Iphone Configuration Utility 能够顺利地将其安装到我的 iPad 上 它是 iOS
  • 如何将一个字符串拆分为多个值?

    如何分割字符串 假设我有一个字符串 狗 猫 老鼠 鸟 我的实际目标是将这些动物中的每一个插入到列表框中 这样它们就会成为列表框中的项目 但我想如果我知道如何拆分字符串 我就知道如何插入这些项目 或者有谁知道更好的方法来做到这一点 我使用 a
  • Symfony 2 - 表单实体类型:如何格式化生成的下拉列表?

    我有一个表单 显示可供选择的类别下拉菜单 这些类别是使用 Gedmo Tree Extension 设置的 因此一个类别可以有子类别 我在表单生成器中有一个自定义查询 它仅选择属于特定组的类别 但是 我需要能够在下拉列表中显示哪些类别是父母
  • 将 vbCrLF 附加到 UCS-2 Little Endian

    我通过 HP UFT 以前的 QTP 使用 vbscript 我面临的问题看起来很简单 但我无法解决 我有从某些系统导出的 CSV 文件 并且该文件中没有完成的 CRLF 我需要一个简单的修复append该文件的新行 我知道这是可能的写入另
  • MIPS 汇编和伪指令

    李 立即加载 MIPS 中的伪指令根据常量的符号和大小以不同方式将常量加载到寄存器中 例如 当常量是二进制补码的 16 位数字 2 15 我找到的链接没有具体解决这个问题 如果你用例子来解释的话那就太好了 我使用火星模拟器 LI当立即数可以
  • 让 python 生成器在后台运行

    现在我有一些代码大致执行以下操作 def generator while True value do some lengthy IO yield value def model for datapoint in generator do s