Asynchronous 同步读/写端口时避免递归?
Rebol 3中的所有端口操作都是异步的。我能找到的进行同步通信的唯一方法是调用Asynchronous 同步读/写端口时避免递归?,asynchronous,io,rebol,rebol3,Asynchronous,Io,Rebol,Rebol3,Rebol 3中的所有端口操作都是异步的。我能找到的进行同步通信的唯一方法是调用wait 但在这种情况下调用wait的问题是,它将检查所有打开端口的事件(即使它们不在传递给wait的端口块中)。然后,它们调用响应事件处理程序,但可以在其中一个事件处理程序中执行读/写操作。这可能导致递归调用“wait” 我该怎么解决这个问题呢?你可以用一把锁。CumCommunication1可以设置一些全局锁状态,即使用变量(确保它是线程安全的)锁定=真。然后,Communication2可以等待解锁 loop
wait
但在这种情况下调用wait的问题是,它将检查所有打开端口的事件(即使它们不在传递给wait的端口块中)。然后,它们调用响应事件处理程序,但可以在其中一个事件处理程序中执行读/写操作。这可能导致递归调用“wait”
我该怎么解决这个问题呢?你可以用一把锁。CumCommunication1可以设置一些全局锁状态,即使用变量(确保它是线程安全的)<代码>锁定=真。然后,Communication2可以等待解锁
loop do
sleep 10ms
break if not locked
end
locked = true
handle_communication()
如果只有异步事件,我们需要同步回复,启动计时器或休眠超时,如果满足处理程序或要求的目标,则说true,否则说false,并确保事件被取消/重置(如果关键)。为什么不创建一种“缓冲区”函数接收来自关联条目的所有消息,并将其作为FIFO(先进先出)进行处理
通过这种方式,您可以保持端口的同步特性,并以同步模式处理它们。我认为存在两个设计问题(可能是现有工具/解决方案固有的)
等待
做得太多了-它将检查所有打开端口的事件
。在一个良好的环境中,应该只在需要的地方实现等待:每个设备、每个端口、每个套接字。。。在共享资源之间创建不必要的相互依赖关系不会有好的结果——尤其是知道共享资源(即使没有相互依赖关系)会产生很多问题事实上,我认为在当前的R3实现中没有解决方案,所以我继续添加了一个“/仅”细化到“等待”,这样,它将只在提供给“等待”的端口上等待,从而避免递归调用。请参见我的pull请求:出于好奇,为什么需要同步?有很多情况下,使用同步端口编码要容易得多:假设您希望通过单击按钮发送电子邮件,并报告成功或失败。在做任何其他事情之前,等待它完成要容易得多。你一定要使用Rebol吗?是的。这实际上更多的是关于REBOL3的问题,而不是一般的同步通信。这实际上更多的是关于REBOL3的问题,而不是一般的同步通信。