Julia - Readall阻止了其他任务

时间:2015-04-18 12:14:01

标签: asynchronous connection localhost buffer julia

我目前正在研究一种名为Julia的新语言。我想从我重写一个oly python脚本,这个脚本的一部分是连接到服务器,在这种情况下,一个来自Android模拟器。 但我对read, readline, readall函数有问题。当没有这些时,他们并没有真正返回,朱莉娅等待并等待获得更多字节。在另一个服务器不发送“\ r \ n”的项目中,即使eof也会永远等待。有没有办法让Julia只读取服务器从缓冲区发送的字节,而不是等待任何字节?我目前的连接代码如下所示:

client = connect("localhost", 7777)
@async while true
    if eof(client) == false
        line = readavailable(client)
        println(line)
    end
end

我如何对其进行编码,以便Julia在数据到达时运行代码,但只读取已到达的内容,而不是等待更多数据。 我也遇到了connect的问题。如果我在终端中使用juli并且想要在没有监听client = connect("localhost", 7777)的端口上建立到本地主机的连接,则会收到一条错误消息,表明连接被拒绝但在脚本中使用相同内容时,整个脚本也会失败,但整个脚本然后停止,在其他语言连接将返回一个错误,我可以尝试用我自己的代码处理问题。有谁知道为什么connect()崩溃了整个剧本?

1 个答案:

答案 0 :(得分:1)

似乎你的问题触及了朱莉娅的3个区域。

  1. 非阻止I / O - 理想情况下,您可以避免使用eof()readavailable()并组合非阻止功能,例如:
  2.     poll_fd(fd, time_s;readable=true)
        readbytes(fd, nb_available(fd))
    

    但非阻塞I / O需要有关原子跃迁的精确保证,据我所知,在0.3.6中,它们并未提供。因此,您可以安排close()

    1. 异常处理 - Julia try/catch阻止Exception像许多其他语言一样致命。

    2. C接口 - 许多软件包为C库提供存根,这些存根可以为特定协议提供更好的功能,即。带有libcurl的HTTPClient。

    3. 将(1)的变通方法与(2)的解决方案集成的示例:

      println("start")
      try 
          s = @spawn begin
              # client = connect("localhost", 7777)
              client = connect("yahoo.com", 80)
              write(client, "GET /\r\n\r\n") # comment this out to test waiting 
              @schedule (sleep(3.0); close(client))
              readall(client)
          end
      
          println(fetch(s))
      
      catch exception
          println("No Luck:", exception)
      end
      println("done.")