2

複数のスレッドとモジュールから共有キューを使用したいと考えています。次の Python コードがあります。

# moda.py

import queue
import modb

q = queue.Queue()

def myPut(x):
    q.put(x)

def main():
    print('moda:', str(id(q)))
    modb.go()
    q.get()


if __name__ == '__main__':
    main()

# modb.py

import moda
import threading


def something():
    print('modb:', str(id(moda.q)))
    moda.myPut('hi')


def go():
    threading.Thread(target = something).start()

somethingスレッド 1 でsomethingElse呼び出され、スレッド 2 で呼び出されます。これら 2 つのメソッドでは のアドレスが異なります。これが、 への呼び出しが返さqれない理由です。getどうすればこれを回避できますか? 循環インポートのためですか、それともマルチスレッドのためですか?

4

1 に答える 1

3

コメントに Austin Phillips が投稿したリンクに答えがあります。

最後に、実行中のスクリプトは __main__ という名前のモジュールで実行されます。スクリプトを独自の名前でインポートすると、__main__ とは無関係の新しいモジュールが作成されます。

したがって、__main__.qmoda.q( にインポートされるmodb) は 2 つの異なるオブジェクトです。

それを機能させる1つの方法は、このような別のメインモジュールを作成し、代わりに実行することですmoda:

# modmain.py

import moda

if __name__ == '__main__':
    moda.main()

ただし、他の共有物を両方にqインポートする新しいモジュールに入れ、他の落とし穴を回避することを検討する必要があります。modamodb

于 2012-08-31T12:00:55.637 に答える