Python中的TideSDK和长处理循环

2024-09-28 21:05:07 发布

您现在位置:Python中文网/ 问答频道 /正文

有没有一种方法可以在Python中执行长处理循环,而不用TideSDK冻结GUI? 否则我只能用线。。。在

谢谢。在


Tags: 方法gui用线执行长tidesdk
1条回答
网友
1楼 · 发布于 2024-09-28 21:05:07

在这里,TideSDK没有什么特别的东西,这是围绕事件循环构建的任何程序的一个普遍问题,这意味着几乎所有的GUI应用程序和网络服务器等等。在

有三种标准解决方案:

  1. 把长任务分解成一堆小任务,每个小任务都安排下一个任务运行。

  2. 每隔一段时间将任务回调回事件循环。

  3. 并行运行任务。

对于第一个解决方案,大多数基于事件的框架都有一个类似doLater(func)或{}的方法。如果没有,它们至少必须有一种向事件循环的队列发布消息的方法,您可以很容易地围绕它构建一个doLater。在类C语言中使用这种API可能很糟糕,在JS中也有点讨厌,只是因为它有奇怪的This/scoping规则,但是在Python和大多数其他动态语言中,它几乎是无痛的。在

由于TideSDK是围绕浏览器JS引擎构建的,它几乎肯定会提供第一个解决方案。在

第二种解决方案实际上只对围绕协作线程或显式协同路由构建的框架有意义。然而,一些传统的单线程框架,如经典的Mac(因此,现代Win32和一些跨平台的框架,如wxWindows)使用它来运行后台作业。在

第一个问题是,您必须小心地处理重新进入(至少wx有一个SafeYield来帮点忙),或者您可能会遇到许多与线程相同的问题,或者,更糟糕的是,除了在大量使用下,您偶尔会从无限递归中得到堆栈崩溃之外,一切似乎都正常。另一个问题是,只有当一次只有一个繁重的后台任务时,它才会真正起作用,因为它的工作效果不是很好

如果您的框架有这样的方法,它将有一个类似yieldToOtherTasks或{}的函数,您所要做的就是确保每隔一段时间调用一次。(但是,如果还有一个doLater,您应该首先考虑这个问题。)如果没有这样的方法,这个解决方案就不适合您的框架。在

第三种解决方案是通过threading.Threadmultiprocessing.Process分离任务。在

这种并行性的问题在于,您必须想出某种方法来安全地发出信号,并安全地共享数据。有些事件循环框架有一个线程安全的“doLater”或“postEvent”方法,如果您需要的唯一信号是“task finished”,并且您只需要共享任务启动参数和返回值,那么一切都很简单。但一旦这还不够,事情就会变得非常复杂。在

另外,如果您有数百个长时间运行的任务要运行,您可能不希望每个任务都有一个线程或进程。事实上,您可能需要一个固定大小的线程或进程池,然后您必须将任务分解为足够小的子任务,这样它们就不会互相饿死,所以实际上,实际上您正在完成解决方案1的所有工作。在

然而,在某些情况下,线程或进程是最简单的解决方案。在

相关问题 更多 >