Python-共享变量的问题
我想使用来自多个线程和模块的共享队列。我有以下Python代码:Python-共享变量的问题,python,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() 及 something在线程1上被调用,som
# 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()
及
something
在线程1上被调用,somethingElse
在线程2上被调用。q
的地址在这两种方法中是不同的-这就是为什么对get
的调用永远不会返回的原因。我怎样才能避免这种情况?是因为循环导入还是因为多线程?由Austin Phillips在评论中发布,答案如下:
最后,执行脚本在一个名为_main _的模块中运行,
以自己的名称导入脚本将创建一个新模块
与主站无关
因此,\uuuu main\uuuu.q
和moda.q
(导入到modb
)是两个不同的对象
使其工作的一种方法是创建一个像这样的独立主模块,并运行它,而不是运行moda
:
# modmain.py
import moda
if __name__ == '__main__':
moda.main()
但是,您仍然应该考虑将<代码> Q>代码>和其他共享的东西放入一个新的模块中,导入到<>代码> MODA和<代码> MODB<代码>,以避免其他陷阱。无论如何,
循环导入是一个坏主意。您似乎不知道moda
import
中的import modb
会阻止循环导入(通过不导入已经存在的内容),但是相互导入肯定会让读者(即您和我)感到困惑。您可以将其扩展到一个可运行的示例吗?请参阅链接以获取有关循环导入的一些好信息。具体而言,此信息可能很重要,这就是为什么循环导入可能会返回部分空的模块。
最好在第三个模块中共享功能。@ryyst如果希望模块通信,请创建第三个模块,导入这两个模块并将它们连接在一起。循环依赖是不好的。
# modmain.py
import moda
if __name__ == '__main__':
moda.main()