python - 全局字典,不是所有线程都向它添加键?

标签 python global-variables

我对 Python 中的全局变量感到困惑。有时,全局变量在程序的所有实例之间共享,有时实例会创建自己的全局变量版本。

我需要的是有一个处理程序来处理放入全局字典中的项目。只有一个函数将项目添加到全局字典中,但该函数会同时运行多次。

在 View 中:

global_dict = {}

def handler():
    global global_dict 

    print "Starting handler"
    while True:
        local_dict = dict(global_dict) 
        for key, v in local_dict.iteritems():
            handle_the_item(v)
            del global_dict[key]
            print "Handled: ", key
        time.sleep(0.05)

def some_function(function_number)
    global global_dict

    print "Starting function", function_number
    for x in y:
        key = random.randint(0, 5000000)
        print function_number, "giving to handler:", key
        global_dict[key] = some_item

我开始:

(我使用 Django,因此每个函数都是通过调用带有某些参数的 url 来启动的)

handler()
some_function(1)
some_function(2)
some_function(3)

它打印:

Starting handler
Starting function 1
Starting function 2
Starting function 3

1 giving to handler 111111
2 giving to handler 222222
3 giving to handler 333333
1 giving to handler 444444
2 giving to handler 555555
3 giving to handler 666666

Handled: 111111
Handled: 222222
Handled: 444444
Handled: 555555

处理程序从不处理函数 3 添加的项目。据我所知,这是因为处理程序和函数 3 都有自己的(据称)全局变量 global_dict 的实例。我还通过在 some_function() 中打印出 global_dict 的长度来验证这一点。随着更多项目的添加,函数 3 中的 global_dict 不断增长。

请注意,哪些函数共享 global_dict 实例以及哪些函数拥有自己的实例是随机的。如果我停止所有操作并再次运行它,则可能所有实例都共享 global_dict。或者没有。或者 3 和 1 以及处理程序。

最佳答案

当您在 Web 服务器后面运行 Django 等应用程序时,Web 服务器通常会将应用程序的多个实例作为单独的长进程运行。如果多个请求同时出现,它们将分布在应用程序进程中。

这意味着您不能依赖在请求之间共享的全局变量。您可能很幸运,请求会进入同一个进程,或者您可能会不幸,不同的请求会发送到应用程序的不同实例。

如果您需要在 Web 请求之间共享状态,那么您应该使用其他一些机制,例如数据库或 memcached。

关于python - 全局字典,不是所有线程都向它添加键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15027137/

相关文章:

php - 使用模板的电子邮件功能。通过 ob_start 和全局变量包含

python - 如何根据引用字典的条件在 Pandas 中创建新列

python - 匹配区域指示符字符类的 python 正则表达式

python - DateTimeField 的 django inspectdb 选项

javascript - 如何创建全局可访问变量?

python - 在python中使用多处理时全局列表不更新

c++ - 如何避免涉及全局变量的循环#include?

c++ - 创建全局 C++ 对象

python - super 基本的uwsgi配置

python - Odoo one2many View