【发布时间】:2015-04-23 13:08:47
【问题描述】:
我已经构建了一个桌面kivy 应用程序,其中包含一些在我的应用程序中执行更改的方法以及需要一些时间(大约 30 秒)的其他计算。当我调用这些方法时,应用程序会在它们执行期间冻结,这是不可取的。有没有办法防止应用冻结,而是显示某种带有动画 gif 的弹出窗口,以便用户知道应用正在处理某些内容并且没有崩溃/停止响应?
我尝试使用多处理在后台运行这些方法,同时出现一个信息弹出窗口,但这些进程不与主应用程序进程共享内存和数据结构。因此,即使该方法成功运行并显示了弹出窗口,应用程序中也没有任何变化......
不管怎样,这是多处理代码:
def run_in_background(self, func, *args):
def run_func(m, a):
# Execute the function with args
m(*a)
def check_process(proc, dt):
if not proc.is_alive():
Clock.unschedule(check_func)
self.dismiss_popup()
# Create background process and start it
p = multiprocessing.Process(target=run_func, args=(func, args))
p.start()
# Create waiting dialog
content = CrunchData()
# Show waiting popup
self.show_popup(title="Some title", content=content, size=(400, 300))
# Create schedulled check for process state
check_func = partial(check_process, p)
Clock.schedule_interval(check_func, .1)
任何帮助将不胜感激。
【问题讨论】:
-
使用子进程,Python 因其 GIL 用于线程管理而名声不佳,docs.python.org/2/library/subprocess.html
-
@e-nouri,子进程在这里不合适。无论如何,多进程绕过 GIL。