【问题标题】:Julia - Readall blocks other tasksJulia - Readall 阻止其他任务
【发布时间】:2015-04-18 12:14:00
【问题描述】:

我目前正在研究一种名为 Julia 的新语言。我想重写我的一个 oly python 脚本,这个脚本的一部分是连接到服务器,在这种情况下,那个来自 android 模拟器。 但我对read, readline, readall 函数有疑问。当取消这些时,它们并没有真正返回,Julia 等待并等待获得更多字节。在另一个服务器不发送 "\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() 会导致整个脚本崩溃?

【问题讨论】:

    标签: asynchronous connection localhost buffer julia


    【解决方案1】:

    您的问题似乎涉及 Julia 的 3 个方面。

    1. 非阻塞 I/O - 理想情况下,您可以避免使用 eof()readavailable() 并结合非阻塞功能,例如:
    poll_fd(fd,time_s;可读=真) 读取字节(fd,nb_available(fd))

    但是非阻塞 I/O 需要关于原子转换的精确保证,据我在 0.3.6 中看到的,它们没有提供。因此,您可以安排close()

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

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

    将 (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.")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-09
      • 2023-03-20
      • 1970-01-01
      • 2016-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多