如何使用objective-c实现go-style通道(CSP)?
我想知道如何为obj-c创建一个库,它的工作方式类似于的Channel/goroutines,但使用的是惯用的obj-c(并且比实际方式少一些样板文件) 在其他使用原生courutines和/或生成器的语言中,可以很容易地对其进行建模,但我不知道如何使用obj-c中的几种并发编程方法来实现这一点(另外,我们的想法是拥有“廉价”线程) 有什么关于我需要做什么的提示吗?我会看看,因为它实现了与Go的goroutine切换算法基本相同的思想:goroutine在系统调用中将要睡眠时将控制权交给调度程序,因此,ST库包装OS级文件描述符,以提供它们自己的类似FD的对象,这些对象可以读取(和/或写入),但不是阻止整个过程。这些操作将控制权转移到库管理的其他轻量级线程 然后,您可能需要一个比ST库更高级的调度器来让操作系统线程忙于运行SP。对Go1.2调度器的一个简单介绍是,它包含一个指向更核心设计文档的链接。其余部分在Go的源代码中如何使用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在系统调用中将要睡眠时将控制权交给调度程序
参见./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视频上有示例代码。我必须像你一样搜索它。