【发布时间】:2021-10-23 18:39:12
【问题描述】:
我想在模块 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)
最好的方法是什么?
【问题讨论】:
-
线程与进程不同。另外,您应该给出一个可重现的示例,我们可以轻松运行。
-
sleep(1) 调用是工作流的一部分,还是只是等待查看作业是否中断?您是否明确偏爱多处理而不是线程?当一个线程处于睡眠状态时(如您的示例),线程可以进行多任务处理,但如果两个进程都需要密集工作,则多处理工作会更好。无论如何,您可以查看任一库中的 Event 类。当事件发生时,它可以让一个线程/进程中的代码向另一个线程/进程发出警报。这是必要的,因为 A 的两个部分将在不同的线程/进程中运行。
-
@MatthiasFripp - 睡眠是为了在请求之间留出空间。最后,我使用了 Roman 的使用 pids 的想法。我对另一种方式没有偏好。
标签: python multiprocessing terminate