Python GUI中的分叉-需要理论澄清

Python GUI中的分叉-需要理论澄清,python,kivy,python-3.6,Python,Kivy,Python 3.6,基本上,分叉意味着将当前流程的精确副本复制到另一个流程中,直到分叉(对吗?这是我理解的方式,如果我错了,请纠正我) 所以,在一个GUI中,如果我把一个代码放在一个“说”按钮上,这个按钮会分叉一个进程来打开一个浏览器,那么我当前的GUI窗口不应该变成两个GUI窗口吗?但结果只有一个。我所说的创建两个GUI窗口的意思是,如果它将进程复制到分叉点,那么它不应该也创建一个复制窗口,因为它复制了所有代码吗 最低可运行代码如下所示: from kivy.app import App from kivy.ui

基本上,分叉意味着将当前流程的精确副本复制到另一个流程中,直到分叉(对吗?这是我理解的方式,如果我错了,请纠正我)

所以,在一个GUI中,如果我把一个代码放在一个“说”按钮上,这个按钮会分叉一个进程来打开一个浏览器,那么我当前的GUI窗口不应该变成两个GUI窗口吗?但结果只有一个。我所说的创建两个GUI窗口的意思是,如果它将进程复制到分叉点,那么它不应该也创建一个复制窗口,因为它复制了所有代码吗

最低可运行代码如下所示:

from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
import webbrowser, os

class something(BoxLayout):
    def __init__(self):
        super().__init__()
        self.add_widget(Button(text='test button'))
        self.add_widget(Label(text='[ref=video]google.com[/ref]',
                    markup=True,
                    on_ref_press=lambda *_: self.open_browser('https://google.com')))

    def open_browser(self, site):

        if not os.fork():
            webbrowser.open(site)






class MainApp(App):
    def build(self):
        return something()


if __name__ == '__main__':
    MainApp().run()  

出于某种原因,GUI在执行fork之后变得无响应,并且在执行fork之后没有两个GUI窗口。背后的理论是什么?

fork不会复制进程,它只会创建另一个进程。@eyllanesc,那么为什么GUI会变得无响应?您认为在创建fork时,父进程会发生什么情况?为什么不使用线程?
os.fork()
会复制进程。在父进程中,调用返回子进程的进程id。在子进程(父进程的副本)中,调用返回0。我怀疑在Kivy应用程序中调用
os.fork()
可能会导致问题。在您的情况下,我认为您甚至不需要fork,只需调用
webbrowser.open()
即可在其自己的窗口中启动web浏览器,您的Kivy应用程序将继续。fork会复制该过程,但不会重新运行gui构建代码(某物中的内容)。\uuu init\uuuu()),因此您将得到两个过程,它们都认为自己是一款具有相同GUI的Kivy应用程序。我猜想在子进程中对GUI的一些引用将是无效的。