Racket 多个通道上的同步/选择evt(运行时确定的数量)
我试图创建一个非常简单的程序,用于测量选择和跨多个通道同步所需的时间。本质上,这个概念就是我有一个发送者和一个接收者。在多次迭代中,发送方随机选择两个已提供的通道之一,并在该通道上发送消息。作为这项工作的一部分,我需要能够控制作为程序的命令行参数所涉及的通道数,因此我不能将预先确定的通道数硬编码到程序中。问题是,我不知道如何从模块中获取Racket 多个通道上的同步/选择evt(运行时确定的数量),racket,Racket,我试图创建一个非常简单的程序,用于测量选择和跨多个通道同步所需的时间。本质上,这个概念就是我有一个发送者和一个接收者。在多次迭代中,发送方随机选择两个已提供的通道之一,并在该通道上发送消息。作为这项工作的一部分,我需要能够控制作为程序的命令行参数所涉及的通道数,因此我不能将预先确定的通道数硬编码到程序中。问题是,我不知道如何从模块中获取sync或choice evt,以使用多个通道 整个计划(如我目前拥有的)如下所示: #lang racket (provide main) (require
sync
或choice evt
,以使用多个通道
整个计划(如我目前拥有的)如下所示:
#lang racket
(provide main)
(require racket/random)
(define (sender iterations channels)
(match iterations
[0 (displayln "sender completed")]
[iter
(let ([choice-chan (random-ref channels)])
(channel-put choice-chan iter)
(sender (- iter 1) channels))]))
(define (receiver iterations channels notification-semaphore)
(match iterations
[0 (begin
(displayln "receiver completed")
(semaphore-post notification-semaphore))]
[iter
(let ([ignored-choice (sync (choice-evt (vector->values channels)))])
(begin (displayln ignored-choice)
(receiver (- iter 1) channels notification-semaphore)))]))
(define (experiment iterations num-channels)
(let ([channels
(vector->immutable-vector
(build-vector num-channels (λ (i) (make-channel))))]
[notification-semaphore (make-semaphore)])
(thread (λ () (receiver iterations channels notification-semaphore)))
(thread (λ () (sender iterations channels)))
(semaphore-wait notification-semaphore)))
(define (main iterations num-channels)
(experiment (string->number iterations) (string->number num-channels))
(displayln "SelectTime completed successfully"))
displayln
表达式并不是严格必需的,它们就在那里,这样我就可以看到确实有东西从发送方传递到接收方
我的问题是,当我只使用一个频道时,一切似乎都很好。但是,对于两个或多个通道,我会收到一个运行时错误,抱怨算术不匹配-预期值为1,但提供了2(如果我在命令行中指定了更多值,则会提供更多)。据我所知,在处理内部表达式后,在计算(选择evt(向量->值通道))
时,此错误发生在接收器
函数内部。我已经尝试了我能想到的每一种变化,比如直接使用频道
,而不使用向量->值
;将向量更改为列表;删除选项evt
(特别是因为,如果我正确阅读了文档,我的测试实际上不需要这样做);移动sync
发生在let
中变量声明之外的位置
在运行时通道数未知的情况下,如何在多个通道上同步?看起来使用向量或列表并不是解决这个问题的正确方法,但我有点困惑于什么是正确的方法
另外,如果您认为这可能会有帮助,请在回答时以其他方式对节目进行评论:)您可以使用
apply
从可变长度的频道列表中选择evt。例如,在上面的代码中,将sync
调用更改为以下内容:
(sync (apply choice-evt (vector->list channels)))