因为tornado-redis比较旧了,所以配套的tornado也得比较旧,最高版本是tornado 4.5.3,5.x.x上以的版本会出现以下错误:
ERROR:tornado.application:Uncaught exception GET / (127.0.0.1)
HTTPServerRequest(protocol='http', host='127.0.0.1:8888', method='GET', uri='/', version='HTTP/1.1', remote_ip='127.0.0.1')
Traceback (most recent call last):
File "D:\Python\Python37\lib\site-packages\tornado\web.py", line 1592, in _execute
result = yield result
File "D:\Python\Python37\lib\site-packages\tornado\gen.py", line 1133, in run
value = future.result()
File "D:\Python\Python37\lib\site-packages\tornado\gen.py", line 1141, in run
yielded = self.gen.throw(*exc_info)
File "D:/区块链/notify2/business/cc_redis.py", line 20, in get
name = yield tornado.gen.Task(c.set, 'name', 'value')
File "D:\Python\Python37\lib\site-packages\tornado\gen.py", line 1133, in run
value = future.result()
File "D:\Python\Python37\lib\site-packages\tornado\stack_context.py", line 339, in wrapped
ret = fn(*args, **kwargs)
File "D:\Python\Python37\lib\site-packages\tornado\gen.py", line 232, in final_callback
if future.result() is not None:
File "D:\Python\Python37\lib\site-packages\tornado\gen.py", line 326, in wrapper
yielded = next(result)
File "D:\Python\Python37\lib\site-packages\tornadoredis\client.py", line 407, in execute_command
self.connection.connect()
File "D:\Python\Python37\lib\site-packages\tornadoredis\connection.py", line 74, in connect
self._stream = IOStream(sock, io_loop=self._io_loop)
File "D:\Python\Python37\lib\site-packages\tornado\iostream.py", line 1222, in __init__
super(IOStream, self).__init__(*args, **kwargs)
TypeError: __init__() got an unexpected keyword argument 'io_loop'
ERROR:tornado.access:500 GET / (127.0.0.1) 13.00ms
但是,如果坚持要用tornado的最新版本和这个一直不更新的tornado-redis一起用,那可以更改一下以下代码,可以正常运行,不过就不知道会不会出现其它什么错误了:
- 打开tornado-redis安装到python目录下面文件
connection.py
,我用的是python37,所以我的目录在:D:\Python\Python37\lib\site-packages\tornadoredis\connection.py,找到Connection
类下的connect
方法,更改如下:
def connect(self):
if not self._stream:
try:
if self.unix_socket_path:
sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
sock.settimeout(self.timeout)
sock.connect(self.unix_socket_path)
else:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
sock.setsockopt(socket.SOL_TCP, socket.TCP_NODELAY, 1)
sock.settimeout(self.timeout)
sock.connect((self.host, self.port))
# 原来的这行,注释掉
# self._stream = IOStream(sock, io_loop=self._io_loop)
# 下面这行是增加的
self._stream = IOStream(sock)
self._stream.set_close_callback(self.on_stream_close)
self.info['db'] = 0
self.info['pass'] = None
except socket.error as e:
raise ConnectionError(str(e))
self.fire_event('on_connect')
tornado-redis在设置了host和port参数的情况下,还一直连接到本地的解决:
conn_pool = tornadoredis.ConnectionPool(max_connections=500, wait_for_available=True)
conn_pool.connection_kwargs['host'] = '192.168.202.128'
conn_pool.connection_kwargs['port'] = 6379
以下是tornaod-redis 在tornado下的一些测试代码:
#coding:utf-8
import tornadoredis
import tornado.httpserver
import tornado.web
import tornado.ioloop
import tornado.gen
conn_pool = tornadoredis.ConnectionPool(max_connections=500, wait_for_available=True)
conn_pool.connection_kwargs['host'] = '192.168.202.128'
conn_pool.connection_kwargs['port'] = 6379
# conn_pool.connection_kwargs['selected_db'] = 1
# print(conn_pool.connection_kwargs)
class MainHandler(tornado.web.RequestHandler):
@tornado.gen.coroutine
def get(self):
c = tornadoredis.Client(selected_db=1, connection_pool=conn_pool)
yield tornado.gen.Task(c.set, 'name', 'value')
yield tornado.gen.Task(c.set, 'age', 1)
yield tornado.gen.Task(c.set, 'height', 170)
name = yield tornado.gen.Task(c.get, 'name')
age = yield tornado.gen.Task(c.get, 'age')
height = yield tornado.gen.Task(c.get, 'height')
self.write(f"name: {name} age: {age} height: {height}")
if __name__ == '__main__':
application = tornado.web.Application([
(r'/', MainHandler),
])
http_server = tornado.httpserver.HTTPServer(application)
http_server.listen(8888)
tornado.ioloop.IOLoop.instance().start()
以上测试代码运行的结果如下: