1

Python のグローバル変数について混乱しています。グローバル変数がプログラムのすべてのインスタンス間で共有されることもあれば、インスタンスが独自のバージョンのグローバル変数を作成することもあります。

必要なのは、グローバル ディクショナリに入れられた項目を処理する 1 つのハンドラーを持つことです。グローバル ディクショナリに項目を追加する関数は 1 つだけですが、この関数は複数回同時に実行されます。

ビューで:

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。

4

1 に答える 1

1

DjangoなどのアプリケーションをWebサーバーの背後で実行すると、Webサーバーは通常、アプリケーションの複数のインスタンスを個別の長いプロセスとして実行します。複数のリクエストが一緒に来ると、それらはアプリケーションプロセス全体に分散されます。

これは、リクエスト間で共有されているグローバル変数に依存できないことを意味します。運が良ければリクエストが同じプロセスに送られる場合もあれば、運が悪くて異なるリクエストがアプリケーションの異なるインスタンスに送られる場合もあります。

Webリクエスト間で状態を共有する必要がある場合は、データベースやmemcachedなどの他のメカニズムを使用する必要があります。

于 2013-02-22T20:49:32.450 に答える