我想手动为线程创建TChan邮箱,其中进来的邮件/网络数据包与来自本地线程的邮件收集在同一队列中。
我不确定Haskell的典型方法是什么。如何从例如一个TChan邮箱的套接字?
那么它会是一个带有几个独立队列的邮箱吗?或者在契约中有几个邮箱?
我调查了epass但尚未尝试过。尽管如此,我想我应该做的事情应该是可能的,我还没有真正详细的想法让我开始。有没有人有类似的代码示例?
答案 0 :(得分:4)
TChan
是一个非常简单的抽象,它本身只是一个惰性数据结构。如果要使用一个,只需根据需要使用它读取/写入线程。
因此,要连接套接字,您只需创建轮询套接字的代码并将任何内容写入TChan
。把它放在一个无限循环中然后把它卷起来让它飞起来。 Haskell的线程相当轻巧,不变性意味着并发性头痛大多不存在,所以除了小心不要使用阻塞FFI调用(这可能是套接字的问题,所以阅读文档)没有理由犹豫使用线程当它们有意义时。
如果你真的想要比这更漂亮的东西并找到一个可行的库,也许是epass
,那么你真正想要的是该特定库的示例代码。
哦,对于它的价值 - TChan
的实现本质上是一个由TVar
组成的链表,其中有两个引用,仅此而已。读取将头指针向前移动,将早期单元格单独留给TChan
或垃圾收集器的任何副本来查找,并且写入在尾指针处创建新单元。当然,所有这些都是在STM交易中完成的。