我正在尝试组合一个具有反应/whenever 块在“后台”消费数据的 Cro 服务。因此,与许多使用 Cro 的 websocket 使用示例不同,这与可以通过浏览器访问的路由无关。
我的用例是使用通过 MQTT 主题接收的消息并对其进行一些处理。在开发的后期阶段,我可能会从这些数据中创建一个供应,但是现在,当接收到数据时,它将存储在一个变量中并取决于某些条件,通过 http post 发送到另一个服务。
我的想法是provider()在Cro::HTTP::Server设置中包含一个,如下所示:
use Cro::HTTP::Log::File;
use Cro::HTTP::Server;
use Routes;
use DataProvider; # Here
my Cro::Service $http = Cro::HTTP::Server.new(
http => <1.1>,
host => ...,
port => ...,
application => [routes(), provider()], # Made this into an array of subs?
after => [
Cro::HTTP::Log::File.new(logs => $*OUT, errors => $*ERR)
]
);
Run Code Online (Sandbox Code Playgroud)
在 DataProvider.pm6 中:
use MQTT::Client;
sub provider() is export {
my $mqtt = MQTT::Client.new: …Run Code Online (Sandbox Code Playgroud) 我似乎很难理解如何正确使用 Raku 中的类。
我正在尝试创建一个“数据库”类,我将在整个 cro 应用程序中使用该类。但是我似乎不明白如何在对象构造(构建?)时处理设置实例变量。
下面的类显示了我在调用它时遇到的问题的示例:
调用:
my $db = Database.new(dsn => 'update me!');
say "what value is foo: " ~ $db.what-is-foo(); # prints "what value is foo: 0" but expecting 123
Run Code Online (Sandbox Code Playgroud)
我的课:
use DB::Pg;
class Database {
has Str $.dsn is required;
has DB::Pg $!dbh = Nil;
has Int $!foo = 0;
method new (:$dsn) {
my $dbh = DB::Pg.new(conninfo => :$dsn);
my $foo = 123;
return self.bless(:$dsn, dbh => $dbh, foo => $foo);
}
method what-is-foo() { …Run Code Online (Sandbox Code Playgroud) 我在rakulang sub reddit 上问了这个问题,并被建议在这里发帖:
我在很多工作中一直退回到 Perl 5,所以我可以“完成它”,因为我对 Perl 5 更加熟悉。
但是,我需要构建一些可以订阅多个 MQTT 主题(在概念上类似于 websocket 订阅)和处理数据的东西,并将大量这些数据保留为内部状态。一个并发项目。所以我认为这是一个让自己沉浸在乐曲中的好机会:)
到目前为止,我知道我需要创建一个供应/给定/设置时,但我不完全确定我将如何处理通过每个主题收到的每个数据流的状态。我的 reddit 帖子的回复建议了 Cro,我认为这非常适合该法案。但仍有一些实现细节我不清楚。
例如,消息有效负载到达 topic foo,我想将该有效负载中的数据添加到现有数组(我的内部状态)。
但是这种对主题的订阅将针对“未确定”数量的主题进行,并将在运行时进行调整。所以不可能有一个硬编码的数组来存储和管理这些数据@foo
例如,在非并发世界中,我可以使用与我的主题名称匹配的键创建一个散列(关联数组)%data<foo>,并将该数组存储在那里。
然而,在并发的世界里,我需要一个互斥问题的答案。如果散列的每个成员都由不同的线程同时修改其数据,那么我认为整个散列将需要锁定。
这至少有可能导致死锁或性能不佳(我预计每秒会有数百条消息,跨多个主题订阅)。
也许我可以基于主题名称“动态”创建一个变量(或者更好的是对象),因此每个数据数组都有一个单独的内存地址。但是,我不确定如何做到这一点,或者确实在这种情况下这是否是“最佳”方法。
总之,问题 1:为此目的动态创建对象或变量是一种声音模式吗?问题 2:是否有一种我根本不知道的设计方法更合适?
因此,任何具体的建议将不胜感激。我觉得这是一个“我不知道我不知道”类型的问题!
谢谢!
好吧,这可能听起来很疯狂,但是可以用rspec来测试perl类吗?我想要的原因是因为我工作的所有生产代码必须是Perl.但我正在学习红宝石,最终会让perl落后.
我知道Test :: Expectation,一个基于rspec的perl测试框架.
但遗憾的是,我们不做第一次测试开发.我想每天都这样做,但是使用rspec.
可能?