2014-01-14 3 views
1

Я пытаюсь реализовать базовую структуру сокета-клиента-сервера с использованием 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

ответ

0

Я путь вне моей области знаний здесь, но никто не отвечает в 10 часов, я сделаю попытку.

Я думаю, проблема в том, что у julia нет агрессивного планировщика. Вы можете использовать функции параллелизма, но они будут запланированы совместно в одном процессе. Поскольку PyCall не возвращает или не вызывает сон (julia?), Элемент управления не возвращается клиенту. Вы можете попробовать addprocs или запустить julia с -p 2, но я не уверен, что это поможет.

См. Также http://docs.julialang.org/en/release-0.2/manual/parallel-computing/, где это намного лучше объяснено.

+0

Спасибо, ivarne. Я пробовал использовать -p 2, но это, похоже, не помогает. Посмотрите на документы более тщательно. – msravi

+1

вам нужно сделать '@everywhere using PyCall', изменить' @ async' на '@spawnat 2 begin ...' и поместить' @ pyimport' внутри блока spawnat. Я просто попробовал, и тогда он отлично работает. или использовать многопроцессорный модуль Python (или, возможно, asynccore). –

Смежные вопросы