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 上被调用。这两种方法的地址q不同 - 这就是调用get永远不会返回的原因。我怎样才能避免这种情况?是因为循环导入还是因为多线程?

4

1 回答 1

3

Austin Phillips 在评论中发布的链接有答案:

最后,执行脚本运行在名为 __main__ 的模块中,以自己的名称导入脚本将创建一个与 __main__ 无关的新模块。

因此,__main__.qmoda.q(导入到modb中)是两个不同的对象。

使其工作的一种方法是像这样创建一个单独的主模块并运行它而不是moda

# modmain.py

import moda

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

但是,您仍然应该考虑将q其他共享内容放入一个新模块中,然后再导入到这两个模块中,modamodb避免其他一些陷阱。

于 2012-08-31T12:00:55.637 回答