Python微web服务总是挂起

2024-10-01 04:58:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我建立了一个微型网络服务,但我发现它挂起了很多。我所说的挂起是指所有请求都将超时,当它挂起时,我可以看到进程在服务器上正常运行,通常只使用大约15MB的内存。我认为这是一个非常有趣的问题后,代码是超级简单,请告诉我我做错了什么。你知道吗

app = Bottle()
# static routing
@app.route('/')
def server_static_home():
    return static_file('index.html', root='client/')

@app.route('/<filename>')
def server_static(filename):
    return static_file(filename, root='client/')

@app.get('/api/data')
def getData():
    data = {}
    arrayToReturn = []
    with open("data.txt", "r") as dataFile:
        entryArray = json.load(dataFile)
        for entry in entryArray:
            if not entry['deleted']:
                arrayToReturn.append(entry)
        data["array"] = arrayToReturn

    return data

@app.put('/api/data')
def changeEntry():

    jsonObj = request.json
    with open("data.txt", "r+") as dataFile:
        entryArray = json.load(dataFile)
        for entry in entryArray:
            if entry['id'] == jsonObj['id']:
                entry['val'] = jsonObj['val']
        dataFile.seek(0)
        json.dump(entryArray, dataFile, indent=4)
        dataFile.truncate()

    return {"success":True}

run_simple('0.0.0.0', 80, app, use_reloader=True)

基本上mydomain.com是路由到我的index.html并加载必要的JS、CSS文件,这就是静态路由部分所做的。一旦页面被加载,一个ajax GET请求被激发到/api/data以加载数据,当我修改数据时,它会激发另一个ajax Put请求到/api/data以修改数据。你知道吗

如何复制

复制挂起非常容易,我只需要访问mydomain.com并快速刷新页面10-30次,然后它就会停止响应。但是我从来没有在本地复制过这个,不管刷新的速度有多快,在本地机器上data.txt也是一样的。你知道吗

更新

结果发现,对文件的读/写并不是问题,而是试图写入损坏的管道的问题。发送请求的客户端在接收所有数据之前关闭连接。我正在寻找解决办法。。。你知道吗


Tags: 数据txtapijsonappdatareturndef
2条回答

看起来您正试图打开并读取每个PUT请求的相同data.txt文件。最终,您将遇到这种体系结构的并发问题,因为您将有多个请求试图打开和写入同一个文件。你知道吗

最好的解决方案是将数据持久化到数据库(比如MySQL、Postgres、Mongodb),而不是写入磁盘上的平面文件。你知道吗

但是,如果您必须写入平面文件,则应该为每个请求写入不同的文件,其中文件名可以是jsonObj['id'],这样可以避免多个请求同时尝试读取/写入同一文件的问题。你知道吗

给你的朋友读和写数据.txt档案将成为卡尔文提到的种族条件的牺牲品。在python中,数据库非常容易,特别是对于像SqlAlchemy这样的库。但是如果您坚持,您也可以使用一个全局字典和一个锁,假设您的web服务器不是作为多个进程运行的。像这样的

entryArray = {}
mylock = threading.Lock()
@app.put('/api/data')
def changeEntry():

    jsonObj = request.json
    with mylock.lock:
        for entry in entryArray:
           if entry['id'] == jsonObj['id']:
              entry['val'] = jsonObj['val']

相关问题 更多 >