如何判断一个`TCPSocket`是否有内容可读?

要读一个Socket的内容,如果是空的话就会被一直阻塞,但是我希望如果当前读不到内容的话就返回nothing或者空数组也行。
bytesavailable结果不管有没有总是 0

julia> bytesavailable(sock.buffer)
0

julia> write(sock, pack([0,1,:ping,()]))
9

julia> bytesavailable(sock.buffer)
0

julia> bytesavailable(sock)
0

julia> readavailable(sock) |> unpack
4-element Vector{Any}:
 0x01
 0x01
     nothing
 true

而且 readavailable 能读到 read 不行…

julia> read(sock)
ERROR: InterruptException:
Stacktrace:
 [1] poptask(W::Base.InvasiveLinkedListSynchronized{Task})
   @ Base .\task.jl:827
 [2] wait()
   @ Base .\task.jl:836
 [3] wait(c::Base.GenericCondition{Base.Threads.SpinLock})
   @ Base .\condition.jl:123
 [4] wait_readnb(x::TCPSocket, nb::Int64)
   @ Base .\stream.jl:413
 [5] read(stream::TCPSocket)
   @ Base .\stream.jl:876
 [6] top-level scope
   @ REPL[46]:1

julia> readavailable(sock)
5-element Vector{UInt8}:
 0x94
 0x01
 0x01
 0xc0

感觉只能自己包装下非阻塞的 TCP。


或者更彻底一点,直接上个消息队列。

上个消息队列,这个。。。
我刚写了这个,还没测试

function recvbytes(sock; timeout=0.001, interval=0.001)
    res = nothing
    ch = Channel{Bool}(1)
    t = @async begin
        isready(ch) && return
        res = readavailable(sock)
    end
    times = Int(timeout / interval)
    while times > 0
        sleep(interval)
        istaskdone(t) && return res
        times -= 1
    end
    put!(ch, true)
    return res
end

备案号:京ICP备17009874号-2