Я пытаюсь реализовать базовую структуру сокета-клиента-сервера с использованием Python и Julia, где производитель находится на Python, а потребитель находится в Julia.Async Thread Deadlock в Julia Когда используется с PyCall
Мой код на стороне Python выглядит следующим образом:
def startServer(host='127.0.0.1', port=4002):
connected = False
s = socket.socket()
s.bind((host, port))
s.listen(5)
scon, addr = s.accept()
print 'Got connection from', addr
return scon, addr
На стороне Джулия, это выглядит следующим образом:
using PyCall
@pyimport server as sdlib
@async begin
sleep(10)
print("In the async thread\n")
s,a = sdlib.startServer("127.0.0.1",4002)
print("Server started\n")
end
print("After the async thread\n")
print("Connecting...\n")
connected = false
while !connected
try
connected = true
c = connect(4002)
print("Connected = $(connected), $(c)\n")
catch ex
print("$(ex)\n")
connected = false
sleep(1)
end
end
print("Connection established: $(c)\n")
Результат выглядит следующим образом:
After the async thread
Connecting...
connect: connection refused (ECONNREFUSED)
connect: connection refused (ECONNREFUSED)
connect: connection refused (ECONNREFUSED)
connect: connection refused (ECONNREFUSED)
connect: connection refused (ECONNREFUSED)
connect: connection refused (ECONNREFUSED)
connect: connection refused (ECONNREFUSED)
connect: connection refused (ECONNREFUSED)
connect: connection refused (ECONNREFUSED)
connect: connection refused (ECONNREFUSED)
In the async thread
Что происходит, так это то, что как только начинается прослушиватель Python, поток блокирует ожидание подключения. Кажется, что управление никогда не возвращается к основному потоку, чтобы клиент мог подключиться.
Оцените любую помощь, которую я могу получить.
Спасибо, Ravi
Спасибо, ivarne. Я пробовал использовать -p 2, но это, похоже, не помогает. Посмотрите на документы более тщательно. – msravi
вам нужно сделать '@everywhere using PyCall', изменить' @ async' на '@spawnat 2 begin ...' и поместить' @ pyimport' внутри блока spawnat. Я просто попробовал, и тогда он отлично работает. или использовать многопроцессорный модуль Python (или, возможно, asynccore). –