这个问题是我的问题Desktop GUI Loading Slow的延续。
我在wxPython中开发了一个桌面GUI,它使用sqlAlchemy进行数据库中的许多记录提取查询。我将获取的记录放在Python字典中并使用它填充GUI。但是,由于我在后台读取数千个数据,因此GUI卡住并加载速度非常慢。现在的问题是:
P.S。:请注意,这是我第一次进行多线程和wxPython。我是Python / Django的早期Web开发人员。此外,由于限制,我无法共享代码。
答案 0 :(得分:2)
您应该重新设计您的应用,以便数据加载部分和数据显示部分是分开的。将数据加载到应该在应用程序中填充数据库模型的单独线程中,使用该模型填充GUI,因此当应用程序加载GUI时将加载快速但会在数据没有的地方显示“loading ...”或类似的内容载满了。
加速事情的另一种方法是在需要之前不要运行查询,例如使用get方法将它们包装在get class DB中,但所有这些都取决于上下文。
此外,如果GUI主要用于视图,那么您可以加载第一组小数据并将其他数据推送到用户必须通过某些菜单或选项卡进行的其他视图,这样您就可以延迟加载直到需要或者在后台加载它们。
答案 1 :(得分:0)
有几种方法可以阻止GUI挂起。当然,您可以执行多线程并将记录填充到全局字典中。但是你可能会遇到global interpreter lock(GIL),这可能无助于你的GUI的重复性。
第一个选项是使用GUI工具包的事件驱动特性,并使用工具包提供的“超时”或“计时器”功能来调用每次调用时加载几个记录的函数。一个generator function可以很好地为此工作。这可能是最容易实现的。您可以一次加载多少条记录取决于机器的速度。我建议从单个记录开始,测量记录的加载,并增加记录的数量,这样每次调用的时间不会超过0.1秒。
其次是使用第二个进程加载数据,然后以小块的形式将其发送到GUI。使用单独的进程(使用multiprocessing
模块)的优点是您无法遇到Python的GIL。请注意,这是方法或多或少包括第一种方法,因为您仍然必须在GUI的事件循环中处理来自第二个进程的消息。
答案 2 :(得分:0)
你没有提到你用来加载数据的小部件,但如果你使用wx.grid.Grid或ListCtrl,那么是的,在各个小部件的虚拟实现中有一些“懒惰”加载东西。例如,请参阅wxPython演示,了解可以容纳一百万个单元格的网格。另见Anurag的回答。您实际上不需要一次加载所有数据。只需加载您可以实际显示的数据。然后,当用户滚动(或在后台线程中预加载)时,您可以加载更多。