我正在尝试编写使用其他模块(demo_2.py)创建子流程的代码 如果我在子流程上获得所需值,则退出程序。
但结果看起来像这样。
似乎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
答案 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_A
和process_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"
条消息。