如何使用objective-c实现go-style通道(CSP)?

如何使用objective-c实现go-style通道(CSP)?,objective-c,concurrency,go,yield,channel,Objective C,Concurrency,Go,Yield,Channel,我想知道如何为obj-c创建一个库,它的工作方式类似于的Channel/goroutines,但使用的是惯用的obj-c(并且比实际方式少一些样板文件) 在其他使用原生courutines和/或生成器的语言中,可以很容易地对其进行建模,但我不知道如何使用obj-c中的几种并发编程方法来实现这一点(另外,我们的想法是拥有“廉价”线程) 有什么关于我需要做什么的提示吗?我会看看,因为它实现了与Go的goroutine切换算法基本相同的思想:goroutine在系统调用中将要睡眠时将控制权交给调度程序

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

在其他使用原生courutines和/或生成器的语言中,可以很容易地对其进行建模,但我不知道如何使用obj-c中的几种并发编程方法来实现这一点(另外,我们的想法是拥有“廉价”线程)

有什么关于我需要做什么的提示吗?

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

然后,您可能需要一个比ST库更高级的调度器来让操作系统线程忙于运行SP。对Go1.2调度器的一个简单介绍是,它包含一个指向更核心设计文档的链接。其余部分在Go的源代码中


参见./P>< P>创建操作,例如对于一个例子,考虑这个过程:

  • 进程
    x
    east
    获取数字,将其转换为字符串,并将其提供给
    west
我可以用一个保持内部状态为
x
(由数字和字符串组成)的对象对其进行建模,并执行以下操作:

  • east输出
    ,由
    east
    过程逻辑在其他地方定义的操作
  • x输入
    ,取决于
    东输出的操作
    。它将编号从
    east output
    的数据结构复制到
    x
    的数据结构中
  • x-output
    ,依赖于
    x-input
    的操作。它的内容被定义为纯粹的内部转换-在我们的示例中,
    stringWithFormat…
  • west输入
    ,依赖于
    x输出的操作
    ,等等

然后将操作转储到
NSOperationQueue
中,看看会发生什么(它是否工作,或者是否存在相互矛盾的依赖项…

我可以使用C库,但问题是如何在obj中实现同样的操作-c@mamcx,我不是建议使用C库,而是建议研究它是如何工作的自动释放池的阴影堆栈,所以当涉及Objective-C代码时,要非常小心尝试任何堆栈骗局。如果切换堆栈上下文,则需要确保这对于自动释放池堆栈是安全的。不幸的是,自动释放池堆栈的维护方式不是一个稳定的ABI,因此苹果可以在不事先通知的情况下对其进行更改,这使得交付与堆栈混乱的应用程序非常危险。对象的建模不是难点。Obj-c没有屈服支持,也没有协程,所以我不知道如何在通道中“等待”和/或进行选择。Obj-c有块和一些更高级的API,但更多的是用于回调式的一次性后台任务,我不知道如何将它们转换为通用的,用于数百个任务,异步/关闭/通道/选择/调度的东西。我知道如何从收益率中获得CSP,但我知道obj-c的收益率是一个巨大的缺陷。然而,我怀疑用积木一定是可能的……我想就此谈上几年。块本身不是解决方案,因为它们与并发无关,而是与闭包有关。(好的,闭包是一个很好的并发工具,但不是一个并发工具。)您可以用GCD做类似的事情。无论如何,在WWDC 2012上关于GCD的讨论中,有一个生成器消费者模式的示例(?)。好的,那么GCD是如何实现的?@Amin:我说,闭包是块,并发是
NSOperation
NSOperationQueue
@mamcx正如我所说的,WWDC视频上有示例代码。我必须像你一样搜索它。