我正在编写一个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)