Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.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
Asynchronous 同步读/写端口时避免递归?_Asynchronous_Io_Rebol_Rebol3 - Fatal编程技术网

Asynchronous 同步读/写端口时避免递归?

Asynchronous 同步读/写端口时避免递归?,asynchronous,io,rebol,rebol3,Asynchronous,Io,Rebol,Rebol3,Rebol 3中的所有端口操作都是异步的。我能找到的进行同步通信的唯一方法是调用wait 但在这种情况下调用wait的问题是,它将检查所有打开端口的事件(即使它们不在传递给wait的端口块中)。然后,它们调用响应事件处理程序,但可以在其中一个事件处理程序中执行读/写操作。这可能导致递归调用“wait” 我该怎么解决这个问题呢?你可以用一把锁。CumCommunication1可以设置一些全局锁状态,即使用变量(确保它是线程安全的)锁定=真。然后,Communication2可以等待解锁 loop

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

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


我该怎么解决这个问题呢?

你可以用一把锁。CumCommunication1可以设置一些全局锁状态,即使用变量(确保它是线程安全的)<代码>锁定=真。然后,Communication2可以等待解锁

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

如果只有异步事件,我们需要同步回复,启动计时器或休眠超时,如果满足处理程序或要求的目标,则说true,否则说false,并确保事件被取消/重置(如果关键)。

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


通过这种方式,您可以保持端口的同步特性,并以同步模式处理它们。

我认为存在两个设计问题(可能是现有工具/解决方案固有的)

  • 等待
    做得太多了-
    它将检查所有打开端口的事件
    。在一个良好的环境中,应该只在需要的地方实现等待:每个设备、每个端口、每个套接字。。。在共享资源之间创建不必要的相互依赖关系不会有好的结果——尤其是知道共享资源(即使没有相互依赖关系)会产生很多问题

  • 事件处理程序可能做得太多。事件处理程序应该尽可能短,并且只处理事件。如果is做得更多,那么处理程序做得太多了——特别是当涉及其他共享资源时。在许多情况下,处理程序只保存数据,否则数据将丢失;异步作业将完成更复杂的工作


  • 事实上,我认为在当前的R3实现中没有解决方案,所以我继续添加了一个“/仅”细化到“等待”,这样,它将只在提供给“等待”的端口上等待,从而避免递归调用。请参见我的pull请求:出于好奇,为什么需要同步?有很多情况下,使用同步端口编码要容易得多:假设您希望通过单击按钮发送电子邮件,并报告成功或失败。在做任何其他事情之前,等待它完成要容易得多。你一定要使用Rebol吗?是的。这实际上更多的是关于REBOL3的问题,而不是一般的同步通信。这实际上更多的是关于REBOL3的问题,而不是一般的同步通信。