全局dict,不是所有线程都向它添加键吗?

2024-04-16 08:44:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我对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来启动的)

^{pr2}$

它打印:

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添加的项。据我所知,这是因为handler和函数3都有各自的全局变量global_dict实例,我还通过在某些函数()中打印出global_dict的长度来验证这一点。函数3中的global-dict随着项目的增加而不断增长。在

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


Tags: to实例key函数处理程序function全局global
1条回答
网友
1楼 · 发布于 2024-04-16 08:44:57

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

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

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

相关问题 更多 >