gpt4 book ai didi

python - 使用多个查询时套接字响应时间变慢

转载 作者:行者123 更新时间:2023-12-03 12:07:51 25 4
gpt4 key购买 nike

我正在使用一个使用ThreadingMixIn使其不阻塞的套接字服务器。该服务器运行良好,可以同时处理数百个连接而没有任何问题。我的问题是从SqlAlchemy开始的,它有助于查询和更新我的数据库。客户端向我的服务器发送消息(每秒)后,我必须在数据库中进行两次查询和一次更新。这两个查询非常简单,并且表很小,更新更成问题,这里我必须通过一个ID(在我的数据库中对该表的ID进行索引)进行更新,并且该表包含数千行。当200个客户端连接到我的服务器时会发生问题,尽管我的脚本能够处理读写端,但是200个连接之后连接空闲且响应时间开始变慢。我使用tcptrack进行了跟踪,发现平均空闲时间从0-1秒增加到2-3秒。我的查询和更新速度很快,但是200次连接后这些查询会使变慢。 我还测量了代码中的执行时间,并且我注意到t1从平均0.005s增加到2s两次。 我附上我的简化代码。

我的简短代码示例:

from config_file import *
import os
import sys
from http.server import BaseHTTPRequestHandler, HTTPServer
import socketserver
import select
from models import Users, Model1, Model2
from base_db import Session, engine, Base, conn

class MyHandler(BaseHTTPRequestHandler):

def __init__(self, request, address, server):
BaseHTTPRequestHandler.__init__(self, request, address, server)

def do_GET(self):
while True:
readable, writable, exceptional = select.select([self.rfile], [self.wfile], [self.rfile, self.wfile])
try:
for s in readable:
s.readline()
try:
t0 = time.time()
session = Session()
model_data_1 = session.query(Model1).filter_by(id=1)
model_data_2 = session.query(Model2).filter_by(foo=False).all()
session.query(Users).filter_by(id=111).update({'test1' : 21, 'test2': 0, 'test3': "FIX", "timstamp": datetime.datetime.utcnow() })
t1 = time.time() - t0
except:
session.rollback()
finally:
session.close()

for s in writable:
session = Session()
try:
self.model_data_2 = session.query(Model2).filter_by(type="test").first()
except:
session.rollback()
finally:
session.close()
if self.model_data_2:
time.sleep(1)
s.write(self.model_data_2.data)
except Exception as e:
print (e)

class MyServer(socketserver.ThreadingMixIn, HTTPServer):
pass

if __name__ == '__main__':
httpd = MyServer((HOST, PORT), MyHandler)
try:
httpd.allow_reuse_address = True
httpd.serve_forever()
except KeyboardInterrupt:
pass

httpd.server_close()
conn.close()

通过数据库配置:
import sqlalchemy as db
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, scoped_session
from config_file import *

engine = db.create_engine("postgresql://" + DB_AUTH_USER +
":" + DB_AUTH_PASSWD + "@" + DB_HOST_PORT + "/" + DB_NAME)
conn = engine.connect()
session_factory = sessionmaker(bind=engine)
Session = scoped_session(session_factory)
Base = declarative_base()

我的问题是为什么要减少200个连接后的平均执行时间?我的查询速度很快,但由于某种原因它开始变慢,还是我的线程在变慢?提前非常感谢您!

最佳答案

最后,我从SqlAlchemy迁移到了 Vanilla psycopg2,这最终解决了我的问题。

关于python - 使用多个查询时套接字响应时间变慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60902216/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com