无法启动kazoo客户端。失败'尝试对非套接字的操作进行操作'

时间:2014-07-14 13:30:45

标签: python python-2.7 kazoo

我刚刚开始使用Kazoo,我无法运行一个非常简单的程序:

from kazoo.client import KazooClient
import logging
logging.basicConfig(level=logging.DEBUG)
from kazoo.retry import KazooRetry
_retry = KazooRetry(max_tries=1000, delay=0.5, backoff=2)
zk = KazooClient(hosts='164.55.92.8:2181', logger=logging, timeout=10, connection_retry=_retry, read_only=True)

zk.start()
import time
print('sleeping 5!')
time.sleep(5)
zk.stop()

输出如下所示:

ERROR:root:Unhandled exception in connection loop  
Traceback (most recent call last):  
  File "C:\Python27\lib\site-packages\kazoo-2.0-py2.7.egg\kazoo\protocol\connection.py", line 522, in _connect_attempt  
    [], [], timeout)[0]  
  File "C:\Python27\lib\site-packages\kazoo-2.0-py2.7.egg\kazoo\handlers\threading.py", line 250, in select  
    return select.select(*args, **kwargs)  
error: (10038, 'An operation was attempted on something that is not a socket')  
INFO:root:Zookeeper session lost, state: CLOSED  
Exception in thread Thread-3:  
Traceback (most recent call last):  
  File "C:\Python27\lib\threading.py", line 551, in __bootstrap_inner  
    self.run()  
  File "C:\Python27\lib\threading.py", line 504, in run  
    self.__target(*self.__args, **self.__kwargs)  
  File "C:\Python27\lib\site-packages\kazoo-2.0-py2.7.egg\kazoo\protocol\connection.py", line 466, in zk_loop  
    if retry(self._connect_loop, retry) is STOP_CONNECTING:  
  File "C:\Python27\lib\site-packages\kazoo-2.0-py2.7.egg\kazoo\retry.py", line 123, in __call__  
    return func(*args, **kwargs)  
  File "C:\Python27\lib\site-packages\kazoo-2.0-py2.7.egg\kazoo\protocol\connection.py", line 483, in _connect_loop  
    status = self._connect_attempt(host, port, retry)  
  File "C:\Python27\lib\site-packages\kazoo-2.0-py2.7.egg\kazoo\protocol\connection.py", line 522, in _connect_attempt  
    [], [], timeout)[0]  
  File "C:\Python27\lib\site-packages\kazoo-2.0-py2.7.egg\kazoo\handlers\threading.py", line 250, in select  
    return select.select(*args, **kwargs)  
error: (10038, 'An operation was attempted on something that is not a socket')  


Traceback (most recent call last):  
  File "C:\Users\klow\Google Drive\mycode\mykazoo\kazooo.py", line 8, in <module>  
    zk.start()  
  File "C:\Python27\lib\site-packages\kazoo-2.0-py2.7.egg\kazoo\client.py", line 537, in start  
    raise self.handler.timeout_exception("Connection time-out")  
TimeoutError: Connection time-out  
>>>   

我在Window 7笔记本电脑上运行它,并且Zookeeper服务器在Linux机器上运行。看起来TCP连接已经组成了一些东西,之后很快搞砸了。我查了一下代码。我可以看到已在connection.py:510(self._connect(host,port))建立了TCP连接,并且已将self._socket分配给create_tcp_connection(socket,* args,** kwargs)返回的对象。但是,connectiom.py:521中的self.handle.select()不喜欢套接字。任何的想法?提前谢谢!

1 个答案:

答案 0 :(得分:2)

我一直在调查这个类似的设置。 Win7 + zookeeper在linux机器上运行。使用Python 3.4。无论如何,我认为这个电话

s = self.handler.select([self._socket, self._read_pipe],
                                        [], [], timeout)[0]

正在尝试对管道进行选择。根据python文档选择管道不适用于Windows。因此看起来kazoo无法在Windows上使用当前架构。我在代码的副本中乱搞配对的套接字,但看起来不太好。

kazoo无法与Windows客户端一起工作,这一事实限制了它的实用性......

更新:所以在kazoo源中的一些黑客可以解决问题。我创建了一个小实用程序函数来在Windows上创建一个socketpair。此套接字对模拟管道,并由utils中的create_pipe函数返回。客户端中有一些地方调用了os.read()和os.write(),我用socket.recv和socket.send替换它们,一切似乎都有效。

我不太确定为什么kazoo正在使用烟斗。它似乎主要用于信号功能,可以通过信号更好地完成。无论如何,我会检查代码,看看是否可以做出更永久的解决方案。