Haskell 如何将TChan邮箱连接到线程并使用套接字接收/发送消息?

Haskell 如何将TChan邮箱连接到线程并使用套接字接收/发送消息?,haskell,Haskell,我想为线程手动创建TChan邮箱,其中传入的消息/网络数据包与来自本地线程的消息收集在同一队列中 我不确定这里典型的哈斯克尔方法是什么。如何从插座写入TChan邮箱 那么它将是一个带有多个独立队列的邮箱吗?或者实际上是几个邮箱 我已经调查过了,但还没有试过。虽然我认为我想做的应该是可能的,但我并没有一个真正详细的想法让我开始。有人有类似的代码示例吗?实际上,我怀疑您可能有点过虑了TChan是一个非常简单的抽象,它本身只是一个惰性的数据结构。如果您想使用它,只要让线程在适当的情况下使用它进行读/写

我想为线程手动创建TChan邮箱,其中传入的消息/网络数据包与来自本地线程的消息收集在同一队列中

我不确定这里典型的哈斯克尔方法是什么。如何从插座写入TChan邮箱

那么它将是一个带有多个独立队列的邮箱吗?或者实际上是几个邮箱


我已经调查过了,但还没有试过。虽然我认为我想做的应该是可能的,但我并没有一个真正详细的想法让我开始。有人有类似的代码示例吗?

实际上,我怀疑您可能有点过虑了
TChan
是一个非常简单的抽象,它本身只是一个惰性的数据结构。如果您想使用它,只要让线程在适当的情况下使用它进行读/写操作即可

因此,要连接套接字,只需创建轮询套接字的代码,并将任何内容写入
TChan
。把它放在一个无限循环中,然后把它卷起来,让它飞起来。Haskell的线程非常轻量级,不变性意味着并发问题基本上不存在,因此除了小心不要使用阻塞FFI调用(这可能与套接字有关,所以请阅读文档),没有理由在线程有意义时犹豫使用线程

如果您真的想要比这更新奇的东西,并找到一个可以工作的库,可能是
epass
,那么您真正想要的是该特定库的示例代码


哦,值得一提的是,
TChan
的实现本质上是一个由
TVar
s组成的链表,其中包含两个引用,仅此而已。读取将头指针向前移动,留下较早的单元格供
TChan
或垃圾收集器的副本查找,写入将在尾指针处创建一个新单元格。当然,所有这些都是在STM事务中完成的。

谢谢。也许是对我所寻找的内容的重新表述:我想从外部将消息/数据发送到内部的一个或多个进程(不是应用程序)。我认为接收、排队和d-排队这样的消息并将它们放入正确的进程实际上是非常困难的,除非每个进程都在不同的tcp/udp端口上接受我认为不优雅的消息。@JFritsch:如果你有多个进程,那无论如何这是不同的事情,不是吗
TChan
用于单个进程中的线程。当然,您可以有一个线程在单个套接字上接受消息,并将消息路由到其他线程的
TChan
s。这些都是非常灵活的工具,所以你可能可以实现你想要的任何通信结构。有没有像self()这样的函数,线程会返回一个唯一的id?@JFritsch:你看过吗?我认为
myThreadId
是您想要的。