使用python与VW守护进程交互

时间:2017-10-31 23:04:16

标签: python python-2.7 sockets daemon vowpalwabbit

我在端口26542上的本地计算机上以守护进程模式运行Vowpal Wabbit(VW)。我可以验证它是否正在运行,因为它使用nc响应它发送给它的消息。

$ echo ' | a b c' | nc localhost 26542
0.050000 0.050000 0.850000 0.050000

我想在python中编写一个客户端来做同样的事情而不调用nc的系统调用,而是使用套接字。这是我到目前为止所拥有的。

class VwClient:
    def __init__(self, vwhost, vwport):
        self._host = vwhost
        self._port = vwport
        self._socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self._socket.connect((self._host, self._port))
        print 'Socket connected to', self._host, 'on port', self._port

    def close(self):
        self._socket.shutdown()

    def get(self, message):
        print 'Sent:', self._socket.send(message)
        d = self._socket.recv(1)
        print d
        return d

我将其调用为:

client = VwClient('localhost', 26542)
client.get(' | a b c')

这就是我所看到的:

$ python vw.py
Socket connected to localhost on port 26542
Sent: 8

之后它就会挂起。我在这里错过了什么?我尝试使套接字无阻塞但我无法使用recv()阅读。我还在recv()尝试了更高的缓冲区大小(尝试了8,64,128,1024),但这也没有用。

修改

对于任何坚持这个问题的人。解决方法是简单地在邮件中添加换行符。仍然需要对get方法进行一些修改。

def get(self, message):
    self._socket.sendall(message) # better use sendall()
    d = self._socket.recv(1024) # assuming max 1024 are received
    return d

这应该被称为client.get(' | a b c\n') # notice the newline

0 个答案:

没有答案