问题标签 [retlang]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
765 浏览

priority-queue - Retlang 中的通道输入优先级

如何以优先方式处理通道输入?有什么等同于 Scala 的 " reactWithin(0) { ... case TIMEOUT }" 构造的吗?

0 投票
2 回答
2091 浏览

c# - 有界队列场景

我需要实现一个生产者/消费者有界队列,多个消费者针对一个生产者。

我有一个推送功能,可以将一个项目添加到队列中,然后检查 maxsize。如果我们达到它返回false,在其他情况下返回true。

在以下代码中,_vector 是一个 List<T>,onSignal 基本上以异步方式消费一个项目。

您看到此代码有问题吗?

0 投票
1 回答
349 浏览

c# - Retlang:退订频道的最佳方式是什么?

我不确定在使用 Retlang 时取消订阅频道的最佳方式是什么。

当您通过调用订阅时,ISubscriber<T>::Subscribe(...)您将返回一个IUnsubscriber. 这个接口没有方法。

上一层,IChannel<T>也没有什么办法。

我唯一能想到的就是将 anISubscriber<T>转换为具体Channel<T>并调用其Unsubscribe()方法或将Unsubscribe()方法添加到ISubscriber<T>.

我很好奇在我修改代码之前是否有人知道他们的想法。

0 投票
7 回答
641 浏览

.net - 基于消息的多线程或线程池用于简短且不常见的操作?

我目前正在使用 Retlang 在 .NET 中进行基于消息的多线程,这是一个很棒的库。我不再有显式锁,每个线程都在做自己的事情,管理应用程序的一部分并通过消息与其他线程通信。

我现在必须实现我的应用程序的一项功能,该功能也可以有自己的发布者/订阅者线程。唯一的问题是这个线程实际上会做很少的工作。预计每 10 分钟左右会收到来自发布者的消息。当收到一条消息时,它会做一些工作,但不会超过几百毫秒。

所以我开始怀疑让一个线程在 99.9% 的时间里处于休眠状态是否真的是一个不错的选择。这种操作有线程池,但由于我无法控制接收消息的线程,所以我不得不求助于丑陋的、容易出错的锁。

我的问题是:在资源方面,让线程闲置,等待绝大多数时间真的是个问题吗?在使用良好的基于​​消息的架构之后使用共享多线程感觉就像回到过去,而且它将是应用程序中唯一带有锁的部分。但我一直在想“我在这里做错了吗?” 用这个线程。

编辑:谢谢大家,在阅读了你们的每一个答案后,我决定另一个线程不是那么大的问题。我的应用程序将仅与基于消息的多线程保持一致,如果我真的有性能问题(但不应该是这样),我会进一步调查。

0 投票
0 回答
741 浏览

.net - 最新的 Retlang 示例

我可以在网上找到的所有 Retlang 示例/教程似乎都很旧:例如

http://ayende.com/Blog/archive/2007/11/01/Retlang--Concurrency-Library-for-C.aspx

http://www.colourcoding.net/blog/archive/2010/05/28/tweaking-the-retlang-queue-channel.aspx

当然,还有测试。还要别的吗?

0 投票
0 回答
346 浏览

c# - 多个发布者向 Retlang 中的单个订阅者发送并发消息?

我需要构建一个应用程序,其中一些对象实例同时生成“脉冲”。(本质上这只是意味着他们正在增加一个计数器。)我还需要跟踪每个对象的总计数器。此外,每当我对计数器执行读取操作时,都需要将其重置为零。

所以我在和一个工作的人交谈,他提到了 Retlang 和基于消息的并发,这听起来非常有趣。但显然我对这个概念很陌生。因此,我构建了一个小型原型,并获得了预期的结果,这非常棒 - 但由于我对 Retlang 和一般的并发编程。

首先,我有这些课程:

这里的想法是我可以实例化多个 Plc,将每个 Plc 传递给相同的 IChannel,然后让它们同时执行 SendPulse 函数,这将允许每个 Plc 发布到同一个通道。但正如你从我的评论中看到的那样,我有点怀疑我所做的是否真的合法。我主要担心在不同 IFiber 的上下文中使用相同的 IChannel 对象发布,但我也担心永远不会从传递给 Enqueue 的委托返回。我希望有人可以就我应该如何处理这个问题提供一些见解。

此外,这里是“订阅者”类:

所以在这里,我重用了分配给 Plc 实例的相同 IChannel,但有不同的 IFiber 订阅它。理想情况下,我可以接收来自每个 Plc 的消息,并更新我班级中的单个私有字段,但以线程安全的方式。

据我了解(并且我在评论中提到),我认为我可以安全地简单地更新我提供给订阅函数的委托中的 _pulseTotals 数组,因为我会连续接收来自 Plcs 的每条消息。

但是,我不确定如何最好地处理需要读取总数并重置它们的位。正如您从代码和注释中看到的那样,我最终为对 _pulseTotals 数组的任何访问加了一个锁。但我不确定这是否有必要,我很想知道a)实际上是否有必要这样做,为什么这样做,或者b)实现类似事情的正确方法。

最后,为了更好地衡量,这是我的主要功能:

我实例化一个单独的 IChannel,将其传递给所有内容,其中 Receiver 在内部使用 IFiber 订阅,而 Plcs 使用 IFibers 来“排队”一个不断发布到频道的非返回方法。

同样,控制台输出看起来与我期望的完全一样,即等待 10 秒后,我看到 Plc 1 的 20 个“脉冲”。并且在读取后重置计数器似乎也有效,即 Plc 1 在每 10 秒增量后有 20 个“脉冲”。但这并不能让我放心,我没有忽略一些重要的事情。

我真的很高兴能更多地了解 Retlang 和并发编程技术,所以希望有人有时间筛选我的代码并针对我的具体问题提供一些建议,或者甚至根据我的要求提供不同的设计!