ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Django:Python全局变量重叠,即使是单独的运行

2019-08-26 10:06:14  阅读:281  来源: 互联网

标签:python django global-variables


我有一个带全局变量的Django(所以Python)程序:

g_variable = []

我使用这是几个函数,我也改变了值:

my_function()
    global g_variable 
    g_variable.append(some_value)

这很有效,直到我开始多次重复调用程序 – 在Django中,这意味着我快速加载了多次网页.我预计全局变量在每次运行中都只是全局变量,但事实并非如此.在一次运行中附加到g_variable的值可以在下一次运行中看到.

对我而言,这意味着我现在必须将此变量传递给我的所有函数:

my_function(non_g_variable)
    non_g_variable.append(some_value)
    return non_g_variable

打电话给

non_g_variable = my_function(non_g_variable)

那是对的吗?在我更改所有代码之前,我只想确保我没有遗漏任何内容.它会添加许多额外的行和返回调用.

解决方法:

您应该重新设计代码以摆脱全局变量,正如其他答案和评论所说.有点像:

class WebpageStructure(object):
    def __init__(self, html):
         # parse the html
         self.structure = self.parse(html)
    def contains_link(self):
         # figure it out using self.structure
         return ...

# in the view(s)
webpage = WebpageStructure(html_to_parse)
if webpage.contains_link():
    ...

但有选择:

>如果您的代码始终在单个线程中运行,则可以通过在每次运行之间将g_variable设置为[]来解决问题.可能有一个顶级函数(也许是一个Django视图函数?),它总是标记每次运行的开始.您应该在此顶级函数中重新初始化g_variable.
>如果您的代码运行多线程,则无法使用普通的全局变量.并发线程将更新相同的全局变量.

关于1和2:要在单个线程中运行Django站点,请使用manage.py runserver –nothreading作为开发服务器.如果您在apache / mod_wsgi中托管站点,则可以使用daemon mode控制此站点.请注意,您可以运行多个单线程并行进程.使用全局变量将在该场景中起作用,因为这些过程是孤立的.

如果可能,您的代码应该适用于任何进程/线程模型.
>如果您的代码运行多线程并且您真的想避免传递g_variable列表,则可以使用线程局部变量.文件herehere.

例:

import threading
threadlocal = threading.local()

def mydjangoview(request):
    # In your top-level view function, initialize the list
    threadlocal.g_variable = []
    # Then call the functions that use g_variable
    foo()
    bar()

    # ... and then I guess you probably return a response?
    return Response(...)

def foo():
    threadlocal.g_variable.append(some_value)

def bar():
    threadlocal.g_variable.append(some_other_value)

其他链接:

> Why is using thread locals in Django bad?
> What is so bad with threadlocals

标签:python,django,global-variables
来源: https://codeday.me/bug/20190826/1728981.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有