1

我正在尝试使用 Python 和 Julia 实现一个基本的客户端-服务器套接字结构,其中生产者在 Python 中,消费者在 Julia 中。

我在 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

在 Julia 方面,它看起来像这样:

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 侦听器启动,线程就会锁定等待连接。控制似乎永远不会传递回主线程以允许客户端连接。

感谢我能得到的任何帮助。

谢谢,拉维

4

1 回答 1

0

我在这里超出了我的知识范围,但是由于没有人在 10 小时内回答,我会尝试一下。

我认为问题在于 Julia 没有积极的调度程序。您可以使用并发特性,但它们将在同一进程中协同调度。由于 PyCall 不返回或调用(julia?)睡眠,因此控件不会返回给客户端。您可以尝试 addprocs 或使用 -p 2 启动 julia,但我不确定它是否会有所帮助。

另请参阅http://docs.julialang.org/en/release-0.2/manual/parallel-computing/,其中对此进行了更好的解释。

于 2014-01-14T22:09:06.903 回答