Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/215.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-共享变量的问题_Python - Fatal编程技术网

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

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