我刚从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连接是由一些东西组成的,在那之后很快就被搞砸了。我查了一下代码。我可以看到,TCP连接已经在connection.py:510 (self._connect(主机,端口))上建立,self._socket被分配给由create_tcp_connection(socket,*args,**kwargs)返回的对象。但是,self.handle.select()在connectiom.py:521上不喜欢套接字。有什么想法吗?提前谢谢你!
发布于 2014-08-17 08:37:33
我一直在用类似的方法调查这件事。Win7 +运行在linux机器上的动物园管理员。使用Python3.4。总之,我觉得这个电话
s = self.handler.select([self._socket, self._read_pipe],
[], [], timeout)[0]正在尝试对管道进行选择。根据python文档,管道上的选择在Windows上不起作用。因此,kazoo似乎不能在Windows上使用当前的体系结构。我在代码副本中乱搞成对的套接字,但看起来不太好。
kazoo不适用于windows客户端这一事实限制了它的实用性.
更新:所以在kazoo源代码中进行一些黑客攻击可以解决这个问题。我创建了一个小的实用函数来在Windows上创建一个套接字对。此套接字对模拟管道,并由create_pipe函数在utils中返回。在客户机中有几个地方可以调用os.read()和os.write(),我用socket.recv和socket.send替换了它们,一切看起来都正常。
我不太清楚kazoo为什么要用管道。这似乎主要是一个信号功能,可以做得更好的信号。无论如何,我将检查代码,看看是否可以找到更持久的解决方案。
https://stackoverflow.com/questions/24737678
复制相似问题