`multiprocessing.Process`在windows和linux中以不同的方式导入变量

时间:2018-03-22 01:44:39

标签: python python-3.x flask python-3.6

背景

为了了解更多 - 并在C中实现更好的跨平台构建 - 我正在研究makefile等效编译器和调试器。像IDE这样的东西,但不是那么多。我不想在这部分中陷入困境,但足以解释我想利用名为gdbgui的开源项目的一部分作为调试器。

在我理想的使用中,我会在自己的gdbgui中启动Process,以便我可以从主进程中删除它。幸运的是,gdbgui是用python编写的,所以用我自己的自定义实现简单地替换main()应该相对简单。

实施

我查看了gdbgui来源,找到main()的相关位,以便我访问backend.py中的功能部分:

  • appFlask()
  • 的一个实例
  • setup_backend显然是用一些配置启动烧瓶服务器的功能。

我的目的是做main()正在做的事情,没有所有的命令行解析。更具体地说,自定义app并运行setup_backend()。为了简洁起见,我删除了一些代码(例如,停止进程),但这是功能位:

from multiprocessing import Process

from gdbgui.backend import app as _app
from gdbgui.backend import setup_backend as _setup_backend

def start_stop_gdb():
    _app.config['rr'] = False
    _app.config['gdb_path'] = 'gdb'
    _app.config['show_gdbgui_upgrades'] = False
    _app.config['initial_binary_and_args'] = ['./debug.elf']

    self.process = Process(
        target=_setup_backend,
        kwargs={
            'serve': True,
            'port': 5000,
            'open_browser': True
        }
    )
    self.process.start()

这实际上在linux中完美运行,这是我第一次尝试它的地方。我的目标是拥有一个非常便携的实现,所以我希望它在Windows中以相同的方式工作。

问题

当我在Windows中运行时,我得到KeyError,其中app没有rr密钥,该密钥是在上面的代码段中专门分配的。

如果我在没有_setup_backend()的情况下直接运行multiprocessing.Process,那么它在Windows和Linux中运行良好,但我的主线程冻结,直到程序退出主程序无法停止调试过程。

要清楚,以下代码段在Windows中有效,但阻止主线程:

def start_stop_gdb():
    _app.config['rr'] = False
    _app.config['gdb_path'] = 'gdb'
    _app.config['show_gdbgui_upgrades'] = False
    _app.config['initial_binary_and_args'] = ['./debug.elf']

    _setup_backend(
        serve=True, port=5000, 'open_browser'=True
    )

简而言之,似乎在linux中,app的实例正在根据需要进行更新,但在Windows中,正在使用单独的app实例。

思想?

0 个答案:

没有答案