我在rakulang sub reddit上问了这个问题,并被建议在这里发帖:
我的很多工作都回到了 Perl 5,所以我可以“完成它”,仅仅是因为我对 Perl 5 更加熟悉了。
但是,我需要构建一些东西来订阅多个 MQTT 主题(在概念上类似于 websocket 订阅)并处理数据,并将这些数据保留为内部状态。一个并发项目。所以我认为这是一个让自己沉浸在 Raku 中的绝佳机会 :)
到目前为止,我知道我需要在设置时创建一个供应/给定/,但我不完全确定我将如何处理通过每个主题接收到的每个数据流的状态。我的 reddit 帖子的回复建议了 Cro,我认为这非常符合要求。但是还有一些我不清楚的实现细节。
例如,消息有效负载到达 topic foo
,我想将该有效负载中的数据添加到现有数组(我的内部状态)。
但是这种订阅主题将发生在“未确定”数量的主题上,并且会在运行时进行调整。所以不可能有一个硬编码的数组来存储和管理这些数据@foo
例如,在非并发世界中,我可以使用与我的主题名称匹配的键创建一个哈希(关联数组)%data<foo>
,并将该数组存储在那里。
然而,在并发世界中,我需要一个互斥锁问题的答案。如果散列的每个成员都让不同的线程同时修改它的数据,那么我认为整个散列都需要一个锁。
这至少有可能导致死锁或性能不佳(我预计每秒有数百条消息,跨多个主题订阅)。
也许我可以根据主题名称“动态地”创建一个变量(或者更好的是对象),因此每个数据数组都有一个单独的内存地址。但是,我不确定如何做到这一点,或者在这种情况下这是否是“最佳”方法。
总而言之,问题 1:为此目的动态创建对象或变量是一种合理的模式吗?问题 2:是否有一种我根本不知道更合适的设计方法?
因此,任何具体的建议将不胜感激。我觉得这是一个“我不知道我不知道什么”类型的问题!
谢谢!