Plutôt que de garder des commentaires, voici ce que je pense que vous essayiez probablement faire:
De l'REPL julia:
julia> server = listen(2000)
Base.TCPServer(active)
julia> @async begin
while true
sock = accept(server)
print(readstring(sock))
end
end
D'un autre terminal:
~ $ nc localhost 2000
Hello from the other terminal
[Ctrl-D] % i.e. signal end of file. this closes the connection
Dans le julia repl, vous verrez "Bonjour de l'autre terminal" imprimé dès que vous envoyez le signal EOF, mais sinon l'invite julia continuera comme d'habitude. Si vous répétez ce processus à partir du terminal netcat, vous verrez à nouveau le message imprimé dans le REPL, car le socket continue de se réactiver dans la boucle while.
Idéalement, si vous voulez fermer le tout, vous devez d'abord close(sock)
puis close(server)
. Mais, vous ne pouvez pas fermer le socket directement, car il est dans la boucle "while" et il continue à être réactivé, et vous n'avez pas directement accès à la variable "sock".
Par conséquent, vous ne pouvez fermer le serveur qu'en attendant une erreur. attraper donc dans un bloc d'essai à la place
EDIT: désolé, mon mauvais, l'exception se rapporte à la prise, pas le serveur, vous devez donc envelopper que dans un bloc catch try dans votre bloc async à la place :
@async begin
while true
try
sock = accept(server)
print(readstring(sock))
catch ex
print("exiting while loop")
break
end
end
end
Je ne peux pas reproduire cela. Faire un exemple normal (pas '@ async'), à la fois' close (sock) 'et' close (server) 'fonctionne bien (julia 0.6.0). Et avec votre exemple ci-dessus, je ne peux pas accéder au serveur et à la chaussette pour les fermer de toute façon –
peut-être que vous vouliez définir le serveur et le socket * en dehors de la tâche '@ async'? –
Je reçois l'erreur que vous avez décrite seulement si j'essaie de fermer le serveur sans avoir fermé le socket en premier. (ce qui est possible dans REPL si vous prenez 'server = listen (2000)' en dehors du bloc asynchrone Et puisque vous imprimez votre propre chaîne, plutôt que de lire depuis le flux, le flux ne se ferme jamais. un meilleur exemple? –