Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Racket 多个通道上的同步/选择evt(运行时确定的数量)_Racket - Fatal编程技术网

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)))