运行后台任务,然后运行 GUI
Posted
技术标签:
【中文标题】运行后台任务,然后运行 GUI【英文标题】:Running background tasks and then the GUI 【发布时间】:2013-10-01 08:21:59 【问题描述】:好的,现在我的小项目几乎完成了,还剩下一些东西,它正在运行我的后台任务,然后显示我的 GUI。
class myGUIApp:
def __init()__:
....
def createwidgets():
....
if __name__ == "__main__":
import myBackgroundTasks
x = myBackgroundTasks()
x.startbackground1() <----- this is background task that doesn't need user interaction
x.startbackground2() <----- this is background task that doesn't need user interaction
MainWindow = myGUIApp()
MainWindow.show() <---- this is Pyside GUI
问题是这样的,直到我的 2 个后台任务完成后,GUI 才会“显示”,这可能需要相当长的时间,因为它们正在执行 I/O 作业和从互联网上抓取文件。我该怎么办?使用python的多线程(在后台任务中,我也在使用多线程)?线程?或多处理模块?还是其他人?谢谢你的回答。
【问题讨论】:
【参考方案1】:您可以将其放在thread
上。由于 Qt gui 在其自己的线程中运行,因此使用起来很有效。使用queue
传回x
的结果。唯一的窍门是您何时何地需要x
?如果你在你的 gui 中需要它,那么最好的办法是使用 gui 的 after 方法,如果它有一个,或者任何它的等价物。关键是您不会占用所有资源,不断检查输出队列。如果你在你的 gui 中放置一个 while 循环,它可能会导致 gui 冻结。
from threading import Thread
from Queue import Queue
class myGUIApp:
def __init()__:
....
def createwidgets():
....
if __name__ == "__main__":
import myBackgroundTasks
QUEUE = Queue()
def queue_fun(q):
x = myBackgroundTasks()
x.startbackground1() <----- this is background task that doesn't need user interaction
x.startbackground2() <----- this is background task that doesn't need user interaction
q.put(x)
THREAD = Thread(target=queue_fun, args=QUEUE)
THREAD.start()
MainWindow = myGUIApp()
MainWindow.show() <---- this is Pyside GUI
# if you can wait until after mainloop terminates to get x, put this here
while THREAD.is_alive()
try:
x = QUEUE.get_nowait()
except Queue.Empty:
continue
# if you need this inside Pyside, then you should put this inside Pyside,
# but don't use while loop, use Qt after function and call self.wait
def wait(self):
try:
x = QUEUE.get_nowait()
except Queue.Empty:
self.after(5, self.wait)
【讨论】:
感谢您的回答。不,我不需要“x”在 GUI 内。后台任务是诸如清理数据库之类的不需要用户交互的东西。用户需要的只是单击一些按钮从数据库中检索信息。就是这样。 线程对你有用吗?如果你不需要x,那么你就不需要队列,只需启动没有args的线程,并且没有队列,让它自己死。 嗨,我没试过。但我认为它会起作用,因为我还在后台任务代码中使用了线程。我想我知道从这里做什么。如果我遇到问题会发布。再次感谢。以上是关于运行后台任务,然后运行 GUI的主要内容,如果未能解决你的问题,请参考以下文章