我想使用来自多个线程和模块的共享队列。我有以下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上调用somethingElse
。q
的地址在这两种方法中是不同的 - 这就是调用{{1}的原因永远不会回来。我怎么能避免这个?是因为循环导入还是因为多线程?
答案 0 :(得分:3)
最后,执行脚本在名为__main__的模块中运行, 以自己的名称导入脚本将创建一个新模块 与__main __无关。
因此,__main__.q
和moda.q
(导入modb
)是两个不同的对象。
使其工作的一种方法是创建一个单独的主模块,然后运行它而不是moda
:
# modmain.py
import moda
if __name__ == '__main__':
moda.main()
但是,您仍应考虑将q
和其他共享内容放入导入moda
和modb
的新模块中,以避免其他一些陷阱。