Python - 共享变量的问题

时间:2012-08-31 11:27:38

标签: python

我想使用来自多个线程和模块的共享队列。我有以下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()
在线程1上调用

something,在线程2上调用somethingElseq的地址在这两种方法中是不同的 - 这就是调用{{1}的原因永远不会回来。我怎么能避免这个?是因为循环导入还是因为多线程?

1 个答案:

答案 0 :(得分:3)

奥斯汀·菲利普斯在评论中发表的{p> The link有答案:

  

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

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

使其工作的一种方法是创建一个单独的主模块,然后运行它而不是moda

# modmain.py

import moda

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

但是,您仍应考虑将q和其他共享内容放入导入modamodb的新模块中,以避免其他一些陷阱。