Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 龙卷风&x2B;莫莫科。重新启动损坏的连接_Python_Django_Tornado_Psycopg2_Momoko - Fatal编程技术网

Python 龙卷风&x2B;莫莫科。重新启动损坏的连接

Python 龙卷风&x2B;莫莫科。重新启动损坏的连接,python,django,tornado,psycopg2,momoko,Python,Django,Tornado,Psycopg2,Momoko,我们使用的是tornado 3.2+momoko 1.1+pgpool 重启pgpool后-我们必须重启tornado 如果我们不重新启动tornado-我们会出现如下错误: [E 140322 19:23:32 web:1305] Uncaught exception POST /api/user/balance/ (127.0.0.1) HTTPRequest(protocol='http', host='127.0.0.1:3001', method='POST', uri='/a

我们使用的是tornado 3.2+momoko 1.1+pgpool

重启pgpool后-我们必须重启tornado

如果我们不重新启动tornado-我们会出现如下错误:

[E 140322 19:23:32 web:1305] Uncaught exception POST /api/user/balance/ (127.0.0.1)
    HTTPRequest(protocol='http', host='127.0.0.1:3001', method='POST', uri='/api/user/balance/', version='HTTP/1.0', remote_ip='127.0.0.1', headers={'Host': '127.0.0.1:3001', 'Connection': 'close', 'Content-Type': 'application/x-www-form-urlencoded', 'Content-Length': '55', 'Accept-Encoding': 'gzip'})
    Traceback (most recent call last):
      File "/projects/application_new/env/lib/python2.7/site-packages/tornado/web.py", line 1192, in _stack_context_handle_exception
        raise_exc_info((type, value, traceback))
      File "/projects/application_new/env/lib/python2.7/site-packages/tornado/web.py", line 1375, in wrapper
        result = method(self, *args, **kwargs)
      File "api_server.py", line 435, in post
        UserBalanceForJSON(self.db, user_id=user_id).results(self.json_callback)
      File "/projects/application_new/env/lib/python2.7/site-packages/tornado/gen.py", line 159, in wrapper
        runner.run()
      File "/projects/application_new/env/lib/python2.7/site-packages/tornado/gen.py", line 529, in run
        yielded = self.gen.throw(*exc_info)
      File "/projects/application_new/api/models/orm.py", line 16, in results
        result = yield momoko.Op(self.db.execute, sql, [])
      File "/projects/application_new/env/lib/python2.7/site-packages/tornado/gen.py", line 520, in run
        next = self.yield_point.get_result()
      File "/projects/application_new/env/lib/python2.7/site-packages/momoko/utils.py", line 41, in get_result
        raise error
    ProgrammingError: execute cannot be used while an asynchronous query is underway
我发现django用户在使用Greenlet时也有同样的问题


如何避免这种情况而不重启龙卷风

临时解决方案-如果连接出错,请关闭连接。为此,让我们以
momoko.Op
为灵感创建一个类:

class OpWithFallback(gen.Task):
    """
    Run a single asynchronous operation.

    Behaves like `tornado.gen.Task`_, but raises an exception (one of Psycop2's
    exceptions_) when an error occurs related to Psycopg2 or PostgreSQL.

    Closes connection with error.

    .. _exceptions: http://initd.org/psycopg/docs/module.html#exceptions
    .. _tornado.gen.Task: http://www.tornadoweb.org/documentation/gen.html#tornado.gen.Task
    """
    def get_result(self):
        (result, error), _ = super(OpWithFallback, self).get_result()
        if error:
            self.fallback(error, result)
        return result

    def fallback(self, error, result):
        log.warning('Closing dead connection or connection with idle transaction: %s' % result.connection)
        result.connection.close()
        raise error
让我们像这样使用它:

result = yield OpWithFallback(self.db.execute, sql, [])

我们应该这样初始化数据库:
self.db=momoko.Pool('dbname=dbname host=127.0.0.1 port=9999',raise\u connect\u errors=False)
。使用
127.0.0.1
而不是
localhost
,并将
raise\u connect\u erros
设置为False,否则您可能无法重新连接数据库。警告和关闭语句应使用try-catch包装,在某些情况下,结果为None