【问题标题】:Stop multiprocessing thread from another module从另一个模块停止多处理线程
【发布时间】: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


【解决方案1】:

如果您使用多处理,则您创建了无法访问彼此变量的单独进程。在这种情况下,您必须通过管道、信号、套接字或标志文件进行通信。

为了能够访问其他变量,您将使用线程而不是多处理。但是,您仍然可以使用 os.kill 通过向其发送 SIGTERMSIGKILL 来终止不同的进程。为此,您需要 PID,您可以在示例中将其设为 configs.process.pid

更多信息在官方文档中:https://docs.python.org/3/library/multiprocessing.html

【讨论】:

    猜你喜欢
    • 2018-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-13
    相关资源
    最近更新 更多