Rebol 3 中的所有端口操作都是异步的。我能找到进行同步通信的唯一方法是调用wait
.
但是在这种情况下调用 wait 的问题是它会检查所有打开端口的事件(即使它们不在传递给等待的端口块中)。然后他们调用他们的响应事件处理程序,但可以在其中一个事件处理程序中完成读/写。这可能会导致递归调用“等待”。
我该如何解决这个问题?
Rebol 3 中的所有端口操作都是异步的。我能找到进行同步通信的唯一方法是调用wait
.
但是在这种情况下调用 wait 的问题是它会检查所有打开端口的事件(即使它们不在传递给等待的端口块中)。然后他们调用他们的响应事件处理程序,但可以在其中一个事件处理程序中完成读/写。这可能会导致递归调用“等待”。
我该如何解决这个问题?
为什么不创建一种“缓冲区”函数来接收来自异步条目的所有消息并将它们作为 FIFO(先进先出)处理?
这样,您可以保持端口的 Assync 特性并在同步模式下处理它们。
在只有异步事件并且我们需要同步回复的情况下,启动计时器或休眠超时,如果满足处理程序或所需目标,则说真,否则假,并确保事件被取消/重置如果关键,则相同。
我认为有两个设计问题(可能是手头的工具/解决方案所固有的)。
Wait
做的太多了—— it will check events for all open ports
。在一个健全的环境中,等待应该只在需要的地方实现:每个设备、每个端口、每个套接字……在共享资源之间创建不必要的相互依赖关系不能很好地结束——尤其是知道共享资源(即使没有相互依赖关系)会产生很多问题。
事件处理程序可能做得太多。事件处理程序应该尽可能短,并且它应该只处理事件。如果 is 做得更多,那么处理程序做得太多 - 特别是如果涉及其他共享资源。在很多情况下,处理程序只是保存数据,否则会丢失;异步作业会做更复杂的事情。
你可以只用一把锁。Cummunication1 可以设置一些全局锁定状态,即使用变量(确保它是线程安全的)。locked = true
. 然后 Communication2 可以等到它被解锁。
loop do
sleep 10ms
break if not locked
end
locked = true
handle_communication()