Python多处理使用错误的函数创建子进程

Python多处理使用错误的函数创建子进程,python,python-2.7,multiprocessing,Python,Python 2.7,Multiprocessing,我正在尝试编写代码,使用另一个模块(demo_2.py)创建子进程, 如果我在子进程上得到想要的值,就退出程序 但结果是这样的 demo_1似乎有两个子进程,分别运行demo_1和加载demo_2。 我想让子进程只运行demo_2 我错过了什么 演示1.py #!/usr/bin/env python # -*- coding: utf-8 -*- from multiprocessing import Process,Queue import sys import demo_2 as A

我正在尝试编写代码,使用另一个模块(demo_2.py)创建子进程,
如果我在子进程上得到想要的值,就退出程序

但结果是这样的

demo_1似乎有两个子进程,分别运行demo_1和加载demo_2。
我想让子进程只运行demo_2

我错过了什么

演示1.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from multiprocessing import Process,Queue
import sys
import demo_2 as A

def multi_process():
    print ("Function multi_process called!")
    process_status_A = Queue()
    process_status_B = Queue()
    A_Process = Process(target = A.process_A, args = (process_status_A,))
    B_Process = Process(target = A.process_A, args = (process_status_B,))
    A_Process.start()
    B_Process.start()
    while True:
        process_status_output_A = process_status_A.get()
        process_status_output_B = process_status_B.get()
        if process_status_output_A == 'exit' and process_status_output_B == 'exit':
            print ("Success!")
            break
    process_status_A.close()
    process_status_B.close()
    A_Process.join()
    B_Process.join()
    sys.exit()


print ("demo_1 started")
if __name__ == "__main__":
    multi_process()
演示2.py

class process_A(object):
    def __init__(self, process_status):
        print ("demo_2 called!")
        process_status.put('exit')
    def call_exit(self):
        pass
应该是

if process_status_A_output == 'exit' and process_status_B_output == 'exit':

结论:变量的命名很重要。 避免使用几乎相同的长变量名(例如
过程状态\u A
过程状态\u A\u输出
)。 首先放置变量名的区别部分有助于澄清变量的含义

所以不是

process_status_A_output
process_status_B_output
也许用

output_A
output_B

因为Windows缺少
os.fork
, 在Windows上,每次生成新的子进程时,都会启动一个新的Python解释器,并导入调用模块。 因此,您不希望在生成的子流程中运行的代码必须是(请特别参阅标题为“安全导入主模块”的部分):

因此使用

if __name__ == "__main__":
    print ("demo_1 started")
    multi_process()
为避免打印额外的
“演示1已启动”
消息

应该是

if process_status_A_output == 'exit' and process_status_B_output == 'exit':

结论:变量的命名很重要。 避免使用几乎相同的长变量名(例如
过程状态\u A
过程状态\u A\u输出
)。 首先放置变量名的区别部分有助于澄清变量的含义

所以不是

process_status_A_output
process_status_B_output
也许用

output_A
output_B

因为Windows缺少
os.fork
, 在Windows上,每次生成新的子进程时,都会启动一个新的Python解释器,并导入调用模块。 因此,您不希望在生成的子流程中运行的代码必须是(请特别参阅标题为“安全导入主模块”的部分):

因此使用

if __name__ == "__main__":
    print ("demo_1 started")
    multi_process()

为了避免打印额外的
“demo_1 started”
消息。

这就解释了为什么我的代码永远不会结束,并且只在Linux上按我想要的方式运行。(未在macOS上测试)谢谢!这就解释了为什么我的代码永远不会结束,并且只在Linux上按我所希望的那样运行。(没有在macOS上测试)谢谢!