在同步读取/写入端口时避免递归?


108

Rebol 3中的所有端口操作都是异步的。我发现进行同步通信的唯一方法是调用wait

但是在这种情况下调用wait的问题是它将检查所有打开的端口的事件(即使它们不在传递给wait的端口块中)。然后他们调用响应的事件处理程序,但是可以在这些事件处理程序之一中进行读/写。这可能导致递归调用“等待”。

我该如何解决?


8
实际上,我认为当前的R3实现中没有解决方案,因此我继续在“ wait”中添加了“ / only”优化,这样,它只会在提供给“ wait”的端口上等待,从而避免了递归调用。请参阅我的拉取请求:github.com/rebol/rebol/pull/177
曾世信

1
出于好奇,您为什么需要使其同步?
toadzky 2015年

1
在许多情况下,使用同步端口进行编码要容易得多:假设您想通过单击按钮发送电子邮件,并报告其成功或失败。在执行其他任何操作之前,等待它完成要容易得多。
曾世信

1
您绝对必须使用Rebol吗?
Rivenfall 2015年

1
是。实际上,这实际上是关于Rebol 3的一个问题,而不是同步通信。
曾世信

Answers:


1

为什么不创建一种“缓冲区”功能来接收来自异步条目的所有消息,并将其作为FIFO(先进先出)进行处理?

这样,您可以保持端口的异步特性,并在同步模式下处理它们。


0

如果只有异步事件,并且我们需要同步答复,请启动计时器或为超时而睡眠,如果满足处理程序或所需的目标,则说“是”,否则说“否”,并确保事件被取消/重置。同样重要。


0

我认为存在2个设计问题(可能是手头的工具/解决方案所固有的)。

  1. Wait做得太多- it will check events for all open ports。在良好的环境中,应仅在需要的地方实施等待:每个设备,每个端口,每个套接字...在共享资源之间创建不必要的相互依赖关系不会很好地结束-特别是知道共享资源(即使没有相互依赖关系)会造成很多问题。

  2. 事件处理程序可能做得太多。事件处理程序应尽可能短,并且仅应处理事件。如果做得更多,则说明处理程序做得过多-特别是在涉及其他共享资源的情况下。在许多情况下,处理程序只是保存数据,否则将丢失这些数据。异步作业会做更复杂的事情。


-1

您可以只使用锁。Cummunication1可以设置一些全局锁定状态,即使用变量(确保它是线程安全的)。locked = true。然后Communication2可以等待直到其解锁。

loop do
    sleep 10ms
    break if not locked
end
locked = true
handle_communication()

1
实际上,这实际上是关于Rebol 3的一个问题,而不是同步通信。
曾世信
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.