从另一个模块停止多处理线程
Stop multiprocessing thread from another module
我想在模块 A 的模块 B 中的多进程中启动无限循环。稍后,我也想终止模块 A 的多进程。
我遇到的问题是,如果我尝试在 B 中保存像 keep_running
这样的布尔值,即使我尝试使用 global
,它也会不断重置。我读过 global
最好避免。
一个
import multiprocessing
keep_running = True
def stop_it(conf):
global keep_running
keep_running = False
def start_it(arg):
while keep_running:
do_stuff(arg)
time.sleep(1)
def main(args):
...
configs.configuartions.Configurations()
configs.process = multiprocessing.Process(target=start_it, args=(arg,))
configs.process.start()
if __name__ == 'main':
import sys
main(sys.argv[1:])
B
import A.main as m
def on_init(<args>):
m.main([conf_file, database])
def on_stop(conf):
m.stop_it(conf)
完成此任务的最佳方法是什么?
如果您使用多处理,则您创建了无法访问彼此变量的独立进程。在这种情况下,您必须通过管道、信号、套接字或标志文件进行通信。
为了能够访问彼此的变量,您将使用线程而不是多处理。但是,您仍然可以使用 os.kill
通过向其发送 SIGTERM
或 SIGKILL
来终止另一个进程。为此,您需要 PID,您可以在示例中将其作为 configs.process.pid
。
更多信息在官方文档中:https://docs.python.org/3/library/multiprocessing.html
我想在模块 A 的模块 B 中的多进程中启动无限循环。稍后,我也想终止模块 A 的多进程。
我遇到的问题是,如果我尝试在 B 中保存像 keep_running
这样的布尔值,即使我尝试使用 global
,它也会不断重置。我读过 global
最好避免。
一个
import multiprocessing
keep_running = True
def stop_it(conf):
global keep_running
keep_running = False
def start_it(arg):
while keep_running:
do_stuff(arg)
time.sleep(1)
def main(args):
...
configs.configuartions.Configurations()
configs.process = multiprocessing.Process(target=start_it, args=(arg,))
configs.process.start()
if __name__ == 'main':
import sys
main(sys.argv[1:])
B
import A.main as m
def on_init(<args>):
m.main([conf_file, database])
def on_stop(conf):
m.stop_it(conf)
完成此任务的最佳方法是什么?
如果您使用多处理,则您创建了无法访问彼此变量的独立进程。在这种情况下,您必须通过管道、信号、套接字或标志文件进行通信。
为了能够访问彼此的变量,您将使用线程而不是多处理。但是,您仍然可以使用 os.kill
通过向其发送 SIGTERM
或 SIGKILL
来终止另一个进程。为此,您需要 PID,您可以在示例中将其作为 configs.process.pid
。
更多信息在官方文档中:https://docs.python.org/3/library/multiprocessing.html