全局变量在不同的功能上是不同的

时间:2015-09-06 11:40:05

标签: python django multithreading python-2.7 global-variables

我知道在函数中使用全局变量是错误的,但我有一个使用这些变量的代码,我有一个问题,我找不到如何解决。

我有一个包含以下代码的模块:

messages = {}

def MessageReceived(message):
    global messages

    print messages
    msgNumber = message[0]
    if messages.has_key(msgNumber):
        messageData = messages.pop(msgNumber)
        ReleaseMessageNumber(msgNumber)
        if messageData["callback"] is not None:
            messageData["callback"](messageData["originalMessage"])

def SendMessage(message, callBack):
    global messages

    msgNumber = GetMessageNumber()

    messageToSend = msgNumber + message + "\0"

    messages[msgNumber] = { 'originalMessage' : message, 'time' : time.time(), 'callback' : callBack }
    print messages
    Send(messageToSend)

    return True

一般来说,功能" SendMessage"使用消息编号构建消息,发送消息并将消息和回调存储在全局字典中。

功能" MessageReceived"从全局字典中获取特定消息的回调并调用它。

问题是这里似乎存在2个不同的词典。

当我发送消息时,我看到字典增长(每次发送消息时都会在字典中添加新记录),但是" MessageReceived"函数总是显示一个空字典。

你可以帮帮我吗?这里的错误在哪里?

谢谢!

1 个答案:

答案 0 :(得分:2)

首先,虽然它不会影响您的问题,但无需在此代码中的任何位置使用global关键字。你永远不会重新分配全局dicts,你只需要改变它们,所以不需要将它们声明为全局 - 无论如何Python都会在模块范围内找到它们。

但问题是所有模块级变量都是每个进程。如果您的接收函数始终在自己的线程中运行,它将永远不会从视图中看到任何数据。

因为你已经知道使用全局变量很糟糕,我不确定你为什么要这样做。有很多方法可以在进程之间传递数据;如果你使用Django,将它存储在数据库中可能是最好的。