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

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

在视图中:

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以及处理程序。

最佳答案

当您在网络服务器后面运行诸如Django之类的应用程序时,网络服务器通常会将应用程序的多个实例作为单独的长进程运行。如果几个请求一起出现,它们将分布在整个应用程序过程中。

这意味着您不能依赖在请求之间共享全局变量。您可能很幸运,并且请求进入了相同的过程,或者您可能很不幸,并且不同的请求进入了应用程序的不同实例。

如果需要在Web请求之间共享状态,则应使用其他机制,例如数据库或内存缓存。

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

10-15 14:06