2016-06-28 18 views
2

Ich habe eine Anzahl von Julia-Arbeitern auf einem separaten Knoten mithilfe eines benutzerdefinierten ClusterManagers gestartet. Standard-TCP/IP-TransportJulia Worker erzeugt eine Ausnahme für defekte Pipes, wenn println verwendet wird

Ich kann remotecall auf den Worker ausführen, aber wenn ich den Remote-Worker bitten, println zu verwenden, schlägt es mit einer fehlerhaften Pipe-Ausnahme fehl.

Irgendeine Idee, warum dies auftreten könnte?

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 

Antwort

0

beantwortete meine eigene Frage nach ein paar Stunden Schweiß und Tränen. Ich hatte ein Detail der Dokumentation falsch verstanden. Der Cluster-Manager muss den IO-Stream stdout verwalten und an das Feld WorkerConfig.io übergeben.

bemerkte ich diese Zeile in der Dokumentation:

  • Der Cluster-Manager die stdout ist für jeden Arbeitnehmer erfasst und macht es

ich ursprünglich dem Master-Prozess zur Verfügung hatte, nehmen nur zu bedeuten, während der anfängliche Handshake, wenn die Arbeiter ihren IP/Port auf stdout schreiben und der vom Master erfasst werden muss, um die Sitzung zu initiieren. Aber jetzt sehe ich, dass der Cluster-Manager stdout ständig von den Arbeitern zum Master umleiten muss.