首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python微web服务总是挂起

Python微web服务总是挂起
EN

Stack Overflow用户
提问于 2016-11-10 06:02:41
回答 2查看 247关注 0票数 0

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

代码语言:javascript
复制
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以加载数据,而当我修改数据时,它会向/api/data发出另一个ajax Put请求来修改数据。

如何复制

这是非常容易复制挂起,我只需要访问mydomain.com和刷新页面10-30次,然后它将停止响应。但是我从来没有能够在本地复制这个,无论我刷新多快,data.txt在我的本地机器上都是一样的。

更新

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

EN

回答 2

Stack Overflow用户

发布于 2016-11-10 06:16:21

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

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

但是,如果您必须写入一个平面文件,那么您应该在每个请求中写入一个不同的文件,其中文件的名称可以是jsonObj['id'],这样可以避免多个请求同时读取/写入同一个文件的问题。

票数 3
EN

Stack Overflow用户

发布于 2016-11-10 06:33:32

正如卡尔文提到的那样,读取和写入data.txt文件将成为竞争条件的牺牲品。在python中,数据库非常容易,特别是使用像SqlAlchemy这样的库。但是如果您坚持,您还可以使用全局字典和锁,假设您的not服务器没有作为多个进程运行。有点像

代码语言:javascript
复制
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']
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40520892

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档