【问题标题】:How implement go style channels (CSP) with objective-c?如何使用 Objective-c 实现 go style channels (CSP)?
【发布时间】:2013-09-12 04:57:45
【问题描述】:

我想知道如何为 obj-c 创建一个 CSP 库,它的工作方式类似于 Go 的通道/goroutines,但使用惯用的 obj-c(并且样板文件比实际方式少)。

在其他具有本机 courutines 和/或生成器的语言中,可以轻松地对其进行建模,但我不明白如何在 obj-c 中进行并发编程的几种方法(另外,这个想法是“便宜的”线程)。

关于我需要做什么的任何提示?

【问题讨论】:

    标签: objective-c concurrency go yield channel


    【解决方案1】:

    我会看看State Threads library,因为它实现了与 Go 的 goroutine 切换算法基本相同的想法:当 goroutine 在系统调用中即将休眠时,它会将控制权交给调度程序,因此 ST 库包装了 OS级文件描述符,以提供它们自己的类似 FD 的对象,这些对象可以读取(和/或写入)但不会阻塞整个进程,这些操作将控制权转移到库管理的其他轻量级线程。

    那么您可能需要一个比 ST 库更高级的调度程序来保持操作系统线程忙于运行您的 SP。 Go 1.2 调度程序的简单介绍是here,它包含指向更核心设计文档的链接。其余的在 Go 的源代码中。

    另见this answer on SO

    【讨论】:

    • 我可以使用 C 库,但问题是如何在 obj-c 中做同样的事情
    • @mamcx,我不建议使用 C 库,我建议研究它的工作原理。
    • Objective-C 运行时为自动释放池维护一个(私有)影子堆栈,因此当涉及到 Objective-C 代码时,请小心尝试任何堆栈恶作剧。如果您切换堆栈上下文,则需要确保这是安全的 WRT 自动释放池堆栈。不幸的是,自动释放池堆栈的维护方式并不是一个稳定的 ABI,因此 Apple 可以在不通知的情况下对其进行更改,这使得发布与堆栈混乱的应用程序非常冒险。
    【解决方案2】:

    创建操作,例如例如考虑这个过程:

    • 进程xeast 获取数字,将其转换为字符串,然后将其提供给west

    我可以用一个保持内部状态x(由数字和字符串组成)的对象和以下操作对其进行建模:

    • east-output,由east 流程逻辑在其他地方定义的操作
    • x-input,依赖于east-output 的操作。它将数字从east-output的数据结构复制到x的数据结构中
    • x-output,依赖于x-input 的操作。它的内容被定义为纯粹的内部转换——在我们的例子中,stringWithFormat...
    • west-input,依赖于x-output的操作等

    然后您将操作转储到NSOperationQueue 并查看会发生什么(它是否有效,或者是否存在相互矛盾的依赖关系...)

    【讨论】:

    • 模型对象不是难点。 Obj-c 没有 YIELD 支持,也没有协程,所以我不知道如何“等待”和/或在频道中执行 SELECT。 Obj-c 有块和一些更高级别的 API,但更多的是用于回调风格的一次性后台任务,我无法掌握如何将它们通用化,用于数百个任务,异步/关闭/通道/选择/调度东西。我知道如何从 YIELD 派生 CSP,但我知道的 obj-c 的 YIELD 是一个巨大的 hack。但是我怀疑块必须是可能的......
    • 多年来我一直想讨论这个问题。块本身不是解决方案,因为它们与并发无关,而是与闭包有关。 (好吧,闭包是用于并发的好工具,但不是用于并发的工具。)你可以用GCD做这样的事情。无论如何,在 WWDC 2012 上关于 GCD 的讨论中有一个生成器消费者模式的示例(?)。
    • 好的,那么用 GCD 怎么做呢?
    • @Amin:我说,闭包是块,并发是NSOperationNSOperationQueue
    • @mamcx 正如我所说,WWDC 视频中有示例代码。我必须像你一样搜索它。
    猜你喜欢
    • 1970-01-01
    • 2022-12-19
    • 2015-07-11
    • 2018-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多