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。