使用PrintLN时,Julia Worker会产生破碎的管道异常



我已经使用自定义clustermanager在单独的节点上启动了许多朱莉娅工人。标准TCP/IP传输。

我可以在工人上运行remoteCall,但是当我要求远程工人使用println时,它会在管道损坏的情况下进行例外。

知道为什么会发生这种情况吗?

julia> remotecall_fetch(90, gethostname)
"gpu-8.local"
julia> remotecall_fetch(90, println, "test")
ERROR: On worker 90:
write: broken pipe (EPIPE)
 in yieldto at ./task.jl:71
 in wait at ./task.jl:371
 in stream_wait at ./stream.jl:60
 in uv_write at stream.jl:962
 in buffer_or_write at stream.jl:972
 in write at stream.jl:1011
 in print at strings/io.jl:46
 in print at strings/io.jl:18
 in println at strings/io.jl:25
 in println at strings/io.jl:28
 in anonymous at multi.jl:923
 in run_work_thunk at multi.jl:661
 [inlined code] from multi.jl:923
 in anonymous at task.jl:63
 in remotecall_fetch at multi.jl:747
 in remotecall_fetch at multi.jl:750

又回答了几个小时的汗水和眼泪后回答了我自己的问题。我误解了文档的细节。群集管理器必须维护IO流并将其传递到WorkerConfig.io字段。

我在文档中注意到了这一行:

  • 群集管理器捕获了每个工人的Stdout,并将其用于主过程

我最初只意思是在最初的握手中,工人将其IP/端口写入STDOUT时,需要由主人捕获以启动会话。但是现在,我看到集群管理器需要将Stdout从工人不断地重定向到主人。

最新更新