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

时间:2016-06-26 16:33:43

标签: python python-2.7 multiprocessing

我正在尝试编写使用其他模块(demo_2.py)创建子流程的代码 如果我在子流程上获得所需值,则退出程序。

但结果看起来像这样。

Unexpected action on my code. This is a screenshot of the result

似乎demo_1制作了两个运行demo_1并加载demo_2的子流程 我想让子流程只运行demo_2。

我错过了什么?

demo_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()

demo_2.py

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

1 个答案:

答案 0 :(得分:3)

if process_status_A == 'exit' and process_status_B == 'exit':

应该是

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

结论:变量的命名很重要。 避免使用几乎相同的长变量名(例如process_status_Aprocess_status_A_output)。 放置变量名的区别部分有助于澄清变量的含义。

所以而不是

process_status_A_output
process_status_B_output

也许使用

output_A
output_B

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

因此使用

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

以避免打印额外的"demo_1 started"条消息。