我看不到将主管添加到崩溃的 gen_tcp:listen-thread 将如何实际重新启动该工作程序。由于崩溃会使我想听的端口暂时无用。当发生崩溃并且我尝试手动重新启动我的应用程序时,我收到“{error,eaddrinuse}”。我还没有为这个工人实施任何主管,因为我看不到它是如何工作的。
如何重新启动 gen_tcp:listen?
我看不到将主管添加到崩溃的 gen_tcp:listen-thread 将如何实际重新启动该工作程序。由于崩溃会使我想听的端口暂时无用。当发生崩溃并且我尝试手动重新启动我的应用程序时,我收到“{error,eaddrinuse}”。我还没有为这个工人实施任何主管,因为我看不到它是如何工作的。
如何重新启动 gen_tcp:listen?
在大多数情况下,由于侦听套接字链接到控制进程(创建它的进程),该进程的终止将很好地关闭套接字并允许您在同一端口上再次侦听。
对于所有其他情况,您应该将{reuseaddr, true}
选项传递给gen_tcp:listen/2
. 实际上,应用程序的侦听套接字在崩溃后会短暂保持活动状态,并且此选项允许您在此期间重用地址。
管理 gen_tcp 套接字的进程是 gen_server 吗?如果是这样,它将使您的生活更轻松。
如果它是 gen_server,请添加process_flag(trap_exit, true)
到您的 init 函数中。这使得当您的进程“崩溃”时,它会terminate/2
在实际退出进程之前调用回调函数。使用此方法,您可以在终止函数中手动关闭您的侦听套接字,从而避免烦人的端口清理延迟。
如果您不使用 gen_server,同样的原则仍然适用,但您必须更加明确地捕捉错误。