相关疑难解决方法(0)

烧瓶中的全局变量是否安全?如何在请求之间共享数据?

在我的应用程序中,通过发出请求来更改公共对象的状态,响应取决于状态.

class SomeObj():
    def __init__(self, param):
        self.param = param
    def query(self):
        self.param += 1
        return self.param

global_obj = SomeObj(0)

@app.route('/')
def home():
    flash(global_obj.query())
    render_template('index.html')
Run Code Online (Sandbox Code Playgroud)

如果我在我的开发服务器上运行它,我希望得到1,2,3等等.如果同时向100个不同的客户提出请求,可能出现问题吗?预期的结果是100个不同的客户端每个都看到1到100之间的唯一数字.或者会发生这样的事情:

  1. 客户端1查询.self.param增加1.
  2. 在可以执行return语句之前,线程切换到客户端2. self.param再次递增.
  3. 线程切换回客户端1,然后客户端返回数字2,比如说.
  4. 现在线程移动到客户端2并返回他/她的数字3.

由于只有两个客户端,预期结果为1和2,而不是2和3.跳过了一个数字.

当我扩展我的应用程序时,这会发生吗?我应该看一下全局变量的替代方案?

python thread-safety flask

70
推荐指数
4
解决办法
2万
查看次数

全局变量和python烧瓶

我想要做的只是从一个API显示第一个.该变量称为"firstevent",该值应显示在网页上.但是firstevent在def中,所以我把它改成一个全局变量,并希望它可以用于不同的函数.但它显示"NameError:全局名称'firstevent'未定义".这就是我在做的事情:

定义一个全局变量

global firstevent
Run Code Online (Sandbox Code Playgroud)

发送此变量一个随机值,它应该是 events['items'][1]['end']

firstevent = 1
Run Code Online (Sandbox Code Playgroud)

在网站上显示firstevent的价值.

@app.route("/")
def index():
    return 'User %s' % firstevent
Run Code Online (Sandbox Code Playgroud)

我不确定现在发生了什么,也许这是一个范围问题?我在网上查了很多答案,但仍无法找到解决方案.

以下是详细信息(不是整个代码)

import os

# Retrieve Flask, our framework
# request module gives access to incoming request data
import argparse
import httplib2
import os
import sys
import json

from flask import Flask, request
from apiclient import discovery
from oauth2client import file
from oauth2client import client
from oauth2client import tools

from apiclient.discovery import build
from oauth2client.client import OAuth2WebServerFlow

import httplib2

global firstevent  
app …
Run Code Online (Sandbox Code Playgroud)

python global-variables flask

17
推荐指数
1
解决办法
4万
查看次数

标签 统计

flask ×2

python ×2

global-variables ×1

thread-safety ×1