2016-09-12 21 views
8

Zapytałem, jak utworzyć serwer TCP, który wysyła dane przez cały czas tutaj: Julia TCP select i działa dobrze. Teraz mam nowy problem, więc pomyślałem o rozpoczęciu nowej rozmowy.Serwer i połączenie Julia TCP

zrobiłem tego rodzaju połączenia jak na zdjęciu: enter image description here

Więc Nadawca wysyła czasami coś do serwera 1 i serwer 1 odczytuje go i aktualizacje co do wysłania do serwera 2 i Server 2 oblicza liczb i komunikuje się z C program.

Oto mój serwer 1 Kod:

notwaiting = true 
message = zeros(10,14) 
server = listen(5001) 
connection = connect(5003) 

while true 
    if notwaiting 
     notwaiting = false 
     # Runs accept async (does not block the main thread) 
     @async begin 
      sock = accept(server) 
      reply= read(sock, Float64, 11) 
      message[:,convert(Int64,reply[1])] = reply[2:11] 

      write(connection,reshape(message,140)) 
      global notwaiting = true 
     end 
    end 
    write(connection,reshape(message,140)) 

    if message[1,1] == -1.0 
     close(connection) 
     close(server) 
     break 
    end 
    sleep(0.01) # slow down the loop 
end 

Sender jest:

Connection2= connect(5001) 
message = [2.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0] 
write(Connection2,message) 
close(Connection2) 

i Server 2 jest tak:

function Server2_connection() 
    println("Waiting for connection") 
    server2 = listen(5003) 

    conn_2 = accept(server2) 

    while isopen(conn_2) 
     try 
      message_server2 = round(read(conn_2,Float64,140),3) 

      ins_matrix = reshape(message_server2[1:140],10,14) 

     catch e 
      println("caught an error $e") 
      break 
     end 
    end 

    println("Connection closed") 
    close(conn) 
    close(server) 
end 

Problemem jest to, że wszystko razem jest naprawdę ciężki. Mam na myśli to, że mogę wysłać 2 wiadomości od nadawcy i wszystko działa bardzo wolno. Mogę uruchomić całą sprawę 10-15, a następnie zamarza. Wszystkie połączenia działają, ale naprawdę wolno. Moje pytanie brzmi: czy czegoś brakuje, czy mam coś, co sprawia, że ​​serwery naprawdę zwalniają? Jak mogę zakodować ten lepszy sposób?

+0

Każdy szczególny powód, dla którego nie używasz [narzędzi równoległych Julii] (http://docs.julialang.org/en/latest/manual/parallel-computing/) do zdalnego wywoływania/zdalnej oceny? –

+0

Nie mogłem odtworzyć spowolnienia ani zamrożenia (wykonanie testu przez około 5 minut i wysłanie 10 wiadomości). Zrobiłem test ze wszystkimi programami z Julią 0.5 + rc3 na systemie Windows i nie było powolności. Nawet przenoszenie serwera serwer2 do komputera Mac (połączonego przez sieć Wi-Fi) 1 i 2 działa poprawnie. Może to problem z wersją lub środowiskiem? (np .: OS, sprzęt, sieć, ...) – Gomiero

+0

Co masz na myśli? Czy możesz wyjaśnić dokładniej, co masz na myśli @FelipeLema –

Odpowiedz

1

Nie mam już problemu z powolnością. Otrzymałem pomoc od julia-użytkowników forum google i na ich temat (Tanmay K. Mohapatra) napisałem lepszy kod do tego samego celu: https://gist.github.com/tanmaykm/c2ab61a52cc5afa0e54fe61905a48ef1 Działa to w taki sam sposób jak .

Problem z obydwoma kodami polega na tym, że nie zamykają poprawnie połączeń. Jeśli serwer 2 przestanie działać, serwer 1 otrzyma błąd zapisu, a serwer 1 pozostanie w trybie nasłuchu.

Inne sposoby działania. Dzięki Tanmay!

Edytuj: znalazłem wolniej .... rzecz, która powinna spowolnić działanie, zrobiła to. Polecenie snu spowolniło, ale zwolniło bardziej, niż się spodziewałem. Gdybym miał zmienną snu 0,001 sekundy, spowolni cały system jak 0.014s. Usunąłem komendę sleep i działa dobrze.

Powiązane problemy