gevent.exceptions.BlockingSwitchOutError InvalidSwitchError

时间:2019-04-05 03:39:49

标签: python sqlalchemy gevent pymysql

我正在编写一个TCP服务器,该服务器使用gevent处理客户端数据,并使用sqlalchemy + pymysql处理数据库mysql。 可能有数千个客户端连接,我的服务器获取了一些数据,然后写入数据库。 但是我的服务器报告了一些异常,运行大约一天后,它停止工作。

以下是例外:

  

Apr 05 11:13:43 python3 [2684]:错误文件:pool.py [line:718]:   重置或类似情况下的异常Apr 05 11:13:43 python3 [2684]:   追溯(最近一次通话):Apr 05 11:13:43 python3 [2684]:   文件“ /usr/local/lib/python3.7/site-packages/sqlalchemy/pool.py”,行   709,在_finalize_fairy 4月5日11:13:43 python3 [2684]:   fairy._reset(pool)4月5日11:13:43 python3 [2684]:文件   “ /usr/local/lib/python3.7/site-packages/sqlalchemy/pool.py”,第880行,   在_reset Apr 05 11:13:43 python3 [2684]:   pool._dialect.do_rollback(self)Apr 05 11:13:43 python3 [2684]:文件   “ /usr/local/lib/python3.7/site-packages/sqlalchemy/dialects/mysql/base.py”,   第1805行,在do_rollback 4月5日11:13:43 python3 [2684]:   dbapi_connection.rollback()Apr 05 11:13:43 python3 [2684]:文件   “ /usr/local/lib/python3.7/site-packages/pymysql/connections.py”,行   432,回滚中Apr 05 11:13:43 python3 [2684]:   self._read_ok_packet()Apr 05 11:13:43 python3 [2684]:文件   “ /usr/local/lib/python3.7/site-packages/pymysql/connections.py”,行   396,在_read_ok_packet中,4月5日11:13:43 python3 [2684]:pkt =   self._read_packet()Apr 05 11:13:43 python3 [2684]:文件   “ /usr/local/lib/python3.7/site-packages/pymysql/connections.py”,行   656,位于_read_packet 4月5日11:13:43 python3 [2684]:packet_header =   self._read_bytes(4)Apr 05 11:13:43 python3 [2684]:文件   “ /usr/local/lib/python3.7/site-packages/pymysql/connections.py”,行   690,以_read_bytes为单位,Apr 05 11:13:43 python3 [2684]:data =   self._rfile.read(num_bytes)Apr 05 11:13:43 python3 [2684]:文件   “ /usr/local/lib/python3.7/socket.py”,第589行,已读入Apr 05   11:13:43 python3 [2684]:返回self._sock.recv_into(b)Apr 05   11:13:43 python3 [2684]:文件   “ /usr/local/lib/python3.7/site-packages/gevent/_socket3.py”,第433行,   在recv_into 4月5日11:13:43 python3 [2684]:   self._wait(self._read_event)Apr 05 11:13:43 python3 [2684]:文件   “ src / gevent / _hub_primitives.py”,第265行,在   gevent.hub_primitives.wait_on_socket 4月5日11:13:43 python3 [2684]:   文件“ src / gevent / _hub_primitives.py”,第266行,位于   gevent .__ hub_primitives.wait_on_socket 4月5日11:13:43 python3 [2684]:   文件“ src / gevent / _hub_primitives.py”,第252行,位于   gevent .__ hub_primitives._primitive_wait 4月5日11:13:43   python3 [2684]:文件“ src / gevent / _hub_primitives.py”,第46行,在   gevent .__ hub_primitives.WaitOperationsGreenlet.wait 4月5日11:13:43   python3 [2684]:文件“ src / gevent / _hub_primitives.py”,第46行,在   gevent .__ hub_primitives.WaitOperationsGreenlet.wait 4月5日11:13:43   python3 [2684]:文件“ src / gevent / _hub_primitives.py”,第55行,在   gevent .__ hub_primitives.WaitOperationsGreenlet.wait 4月5日11:13:43   python3 [2684]:文件“ src / gevent / _waiter.py”,第151行,在   gevent .__ waiter.Waiter.get Apr 05 11:13:43 python3 [2684]:文件   “ src / gevent / _greenlet_primitives.py”,第59行,在   gevent .__ greenlet_primitives.SwitchOutGreenletWithLoop.switch 4月5日   11:13:43 python3 [2684]:文件“ src / gevent / _greenlet_primitives.py”,   第59行,在   gevent .__ greenlet_primitives.SwitchOutGreenletWithLoop.switch 4月5日   11:13:43 python3 [2684]:文件“ src / gevent / _greenlet_primitives.py”,   第62行,在   gevent .__ greenlet_primitives.SwitchOutGreenletWithLoop.switch 4月5日   11:13:43 python3 [2684]:文件“ src / gevent / _greenlet_primitives.py”,   第65行,在   gevent .__ greenlet_primitives.SwitchOutGreenletWithLoop.switch_out 4月   05 11:13:43 python3 [2684]:文件“ src / gevent / _greenlet_primitives.py”,   66行,在   gevent .__ greenlet_primitives.SwitchOutGreenletWithLoop.switch_out 4月   05 11:13:43 python3 [2684]:gevent.exceptions.BlockingSwitchOutError:   无法在事件循环回调中调用阻止功能4月5日   11:13:50 python3 [2684]:错误文件:pool.py [line:718]:异常   在重置或类似的过程中Apr 05 11:13:50 python3 [2684]:追溯   (最近一次通话最近):Apr 05 11:13:50 python3 [2684]:文件   “ /usr/local/lib/python3.7/site-packages/sqlalchemy/pool.py”,第709行,   in _finalize_fairy Apr 05 11:13:50 python3 [2684]:fairy._reset(pool)   4月5日11:13:50 python3 [2684]:文件   “ /usr/local/lib/python3.7/site-packages/sqlalchemy/pool.py”,第880行,   在_reset Apr 05 11:13:50 python3 [2684]中:   pool._dialect.do_rollback(self)Apr 05 11:13:50 python3 [2684]:文件   “ /usr/local/lib/python3.7/site-packages/sqlalchemy/dialects/mysql/base.py”,   第1805行,在do_rollback 4月5日11:13:50 python3 [2684]中:   dbapi_connection.rollback()Apr 05 11:13:50 python3 [2684]:文件   “ /usr/local/lib/python3.7/site-packages/pymysql/connections.py”,行   432,回滚中Apr 05 11:13:50 python3 [2684]:   self._read_ok_packet()Apr 05 11:13:50 python3 [2684]:文件   “ /usr/local/lib/python3.7/site-packages/pymysql/connections.py”,行   396,在_read_ok_packet中,4月5日11:13:50 python3 [2684]:pkt =   self._read_packet()Apr 05 11:13:50 python3 [2684]:文件   “ /usr/local/lib/python3.7/site-packages/pymysql/connections.py”,行   656,位于_read_packet 4月5日11:13:50 python3 [2684]:packet_header =   self._read_bytes(4)Apr 05 11:13:50 python3 [2684]:文件   “ /usr/local/lib/python3.7/site-packages/pymysql/connections.py”,行   690,以_read_bytes的价格05月4日11:13:50 python3 [2684]:data =   self._rfile.read(num_bytes)Apr 05 11:13:50 python3 [2684]:文件   “ /usr/local/lib/python3.7/socket.py”,第589行,已读入Apr 05   11:13:50 python3 [2684]:返回self._sock.recv_into(b)Apr 05   11:13:50 python3 [2684]:文件   “ /usr/local/lib/python3.7/site-packages/gevent/_socket3.py”,第433行,   在recv_into 4月5日11:13:50 python3 [2684]:   self._wait(self._read_event)Apr 05 11:13:50 python3 [2684]:文件   “ src / gevent / _hub_primitives.py”,第265行,在   gevent .__ hub_primitives.wait_on_socket 4月5日11:13:50 python3 [2684]:   文件“ src / gevent / _hub_primitives.py”,第266行,位于   gevent .__ hub_primitives.wait_on_socket 4月5日11:13:50 python3 [2684]:   文件“ src / gevent / _hub_primitives.py”,第252行,位于   gevent .__ hub_primitives._primitive_wait 4月5日11:13:50   python3 [2684]:文件“ src / gevent / _hub_primitives.py”,第46行,在   gevent .__ hub_primitives.WaitOperationsGreenlet.wait 4月5日11:13:50   python3 [2684]:文件“ src / gevent / _hub_primitives.py”,第46行,在   gevent .__ hub_primitives.WaitOperationsGreenlet.wait 4月5日11:13:50   python3 [2684]:文件“ src / gevent / _hub_primitives.py”,第57行,在   gevent .__ hub_primitives.WaitOperationsGreenlet.wait 4月5日11:13:50   python3 [2684]:gevent.exceptions.InvalidSwitchError:无效的开关   进入.CloudServer对象   0x7f5fa93df630 >>(:   (预期)

我的代码是这样的:

import gevent
from gevent import socket,monkey
monkey.patch_all()

def TcpServer(host='', port=gPort, dataHandler=None):
    sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    sock.bind((host, port))

    sock.listen(ClientNum)
    while True:
        try:
            fd, addr = sock.accept()
            logging.info('addr %s, fd %s' % (str(addr), str(fd)))
            gevent.spawn(dataHandler, fd, addr)
        except Exception as e:
            fd.close()

mEngine = create_engine(
    "mysql+pymysql://%s:%s@%s:3306/%s?charset=utf8" % (gDbAccount, gDbPassword, ipAddr, dbName),
    poolclass=NullPool
)

def dataHandler(fd, addr):
    data = fd.recv()
    writeDb(data)

0 个答案:

没有答案
相关问题