英文:
How implement go style channels (CSP) with objective-c?
问题
我想知道如何为Objective-C创建一个类似于Go语言中的通道/协程的CSP库,但要使用Objective-C的惯用方式(比实际方法少一些样板代码)。
在其他具有本地协程和/或生成器的语言中,可以很容易地建模,但我不知道如何在Objective-C中使用几种并发编程方法来实现相同的效果(此外,想要实现“廉价”线程的想法)。
有关我需要做什么的任何提示吗?
英文:
I wonder how create a CSP library for obj-c, that work like Go's channels/goroutines but with idiomatic obj-c (and less boilerplate than actual ways).
In other languages with native courutines and/or generators is possible to model it easily, but I don't grasp how do the same with the several ways of do concurrent programing in obj-c (plus, the idea is have "cheap" threads).
Any hint about what I need to do?
答案1
得分: 1
我会查看State Threads库,因为它实现了与Go的goroutine切换算法基本相同的思想:当goroutine在系统调用中即将休眠时,它将控制权交给调度器,因此ST库封装了操作系统级的文件描述符,提供了自己的类似FD的对象,可以从中读取(和/或写入),但是这些操作不会阻塞整个进程,而是将控制权转移到由库管理的其他轻量级线程。
然后,您可能需要一个比ST库更先进的调度器来保持操作系统线程忙于运行您的SP。关于Go 1.2调度器的简单介绍可以在这里找到,并且其中包含了一个更深入的设计文档的链接。其余的内容可以在Go的源代码中找到。
还可以参考Stack Overflow上的这个答案。
英文:
I would look at the State Threads library as it implements roughly the same idea which underlies the goroutine switching algorythm of Go: a goroutine surrenders control to the scheduler when it's about to sleep in a syscall, and so the ST library wraps OS-level file descriptors to provide their own FD-like objects which can be read from (and/or written to) but instead of blocking the whole process these operation transfer control to other light-weight threads managed by the library.
Then you might need a scheduler more advanced than that of the ST library to keep OS threads busy running your SPs. A no-brainer introduction to the Go 1.2 scheduler is here, and it contains a link to a more hard-core design document. The rest is in the Go's source code.
See also this answer on SO.
答案2
得分: 0
创建操作,例如考虑以下过程:
- 过程
x
从east
获取数字,将其转换为字符串,并将其传递给west
。
我可以使用一个对象来模拟它,该对象保持 x
的内部状态(包括数字和字符串),并具有以下操作:
east-output
,由east
过程逻辑在其他地方定义的操作x-input
,依赖于east-output
。它将数字从east-output
的数据结构复制到x
的数据结构中x-output
,依赖于x-input
。它的内容被定义为纯粹的内部转换 - 在我们的示例中,是stringWithFormat...
west-input
,依赖于x-output
,等等。
然后,将这些操作转储到 NSOperationQueue
中,看看会发生什么(是否工作,或是否存在相互矛盾的依赖关系...)
英文:
Create operations, e.g. for an example consider this process:
- process
x
takes number fromeast
, transforms it to a string, and gives it towest
.
That I could model it with an object that keeps an internal state of x
(consisting of number and string) and the following operations:
east-output
, operation defined somewhere else byeast
process logicx-input
, operation that depends oneast-output
. It copies number fromeast-output
's data structure intox
's data structurex-output
, operation that depends onx-input
. Its content is defined as purely internal transformation - in our example,stringWithFormat...
west-input
, operation that depends onx-output
, etc.
Then you dump the operations into NSOperationQueue
and see what happens (does it work, or are there contradicting dependencies...)
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论