Unix 后台TCP服务器

Unix 后台TCP服务器,unix,tcp,julia,Unix,Tcp,Julia,我的用例 创建一个Julia后台进程,我可以从另一台服务器调用它。当我向它传递一些参数时,它会进行填充,发送响应,然后等待下一个请求 我试过的 如果有更“Julia”的方法,请告诉我,但我认为这对于TCP服务器来说是一个很好的用例,如文档示例中所示: using Sockets @async begin server = listen(2001) while true sock = accept(server) @asyn

我的用例

创建一个Julia后台进程,我可以从另一台服务器调用它。当我向它传递一些参数时,它会进行填充,发送响应,然后等待下一个请求

我试过的

如果有更“Julia”的方法,请告诉我,但我认为这对于TCP服务器来说是一个很好的用例,如文档示例中所示:

using Sockets

@async begin
       server = listen(2001)
       while true
           sock = accept(server)
           @async while isopen(sock)
               write(sock,readline(sock))
           end
       end
   end
…在REPL中运行良好!但我希望它在后台永久运行,这样我就不需要保持REPL打开

当我将上述内容放入app.jl并运行julia app.jl时,它显然会运行,然后立即退出。即使在关闭终端后,保持其运行的最佳方法是什么

编辑

我的客户端是一个Elixir服务器。 出于性能方面的考虑,我更喜欢TCP而不是HTTP,但如果最终工作量太大,我会被说服。
我在评论中加入了几个选项。 现在,最简单的方法是在代码中删除begin语句前面的@async,然后运行I假设Linux:

nohup julia app.jl &
当然,您可以添加1>和2>来重定向标准输出和标准错误,将其作为cron作业等


然而,JuliaWebAPI+ZeroMQ对于生产系统将更加健壮,对于计算解决方案来说,分布式将更加方便

实际上,对于将来的任何人来说,根据您的用例,更好的答案可能是在文件底部添加以下内容:

Base.JLOptions.isinteractive==0&&wait


这将导致它不会自动退出。不需要外部库或框架。

您希望如何调用该过程?你的客户是什么?如果您的客户在某些情况下是Julia,最简单的方法是使用分布式调用远程Julia,而不是担心任何事情。或者你需要它是一个套接字服务器吗?在这里,您可以像您尝试过的那样实现,或者使用JuliaWebAPI和ZeroMQ将Julia函数发布为RESTful服务。有一个名为isinteractive的函数已经从Base导出并返回布尔值,因此可以将其简化为isinteractive | | waitNice!非常感谢。更干净^