我在Python中创建一个使用SQLite数据库和wxPython的应用程序。我想以某种方式使用MVC实现它。我只是对线程感到好奇。我应该在使用GUI的任何场景中执行此操作吗?这种应用需要吗?
答案 0 :(得分:1)
我从javascript / node.js学到的一件事是异步编程和并行编程之间存在差异。在异步编程中,您可能会有一些不按顺序运行的事情,但任何给定的任务在其他东西开始运行之前都会运行完成。这样你就不必担心使用信号量和锁等同步共享资源了,如果你有多个并行运行的线程,同时运行或者可能被抢占,这将是一个问题,因此需要锁定
你最有可能在gui环境中做某种异步代码,并且你也不需要同时进行并行多线程代码。
答案 1 :(得分:1)
您将使用多线程来执行您不希望主线程等待的并行或后台任务,您不希望它在运行时挂起GUI,或干扰用户交互性或其他一些优先级任务。
今天的大多数应用程序都不使用多线程或使用很少的线程。即使他们确实使用多线程,它通常是因为最终程序员正在使用的库,甚至不知道在开发他的应用程序时发生了多线程。
即使像AutoCAD这样的主要软件也只使用很少的多线程。并不是它的制作很差,但多线程有非常特殊的应用。例如,在他想要处理的项目仍在加载时允许用户交互是没有意义的。设计用于与单个用户交互的软件几乎不需要它。
您可以看到多线程适合的一个非常重要的角色是服务器,其中单个应用程序可以参与来自数千个用户的请求而不会相互干扰。在这种情况下,确保每个人都满意的更简单方法是为每个请求创建一个新线程。
答案 2 :(得分:1)
实际上,GUI通常是单线程实现,其中单个线程(称为UI线程)不断轮询事件并按发生顺序继续执行它们。
关于主要问题,请考虑这种情况。
点击一个按钮,你想做一些耗时的事情,比如5-10秒或更长时间。你有2个选择。
但是,有些情况下您不希望用户在发生某些事情时使用该应用程序。在这种情况下,通常您仍然可以使用单独的线程,但使用某种覆盖/进度指示器组合阻止UI。
答案 3 :(得分:0)
几乎可以肯定你已经......
很多wx已经被异步事件循环驱动..
表示你应该使用wx.PubSub在MVC风格的wx应用程序中进行通信,但你不太可能需要实现任何类型的线程(你实际上是免费获得的)
使用python线程(由gil锁定)的几个好地方是:
一些地方使用多处理(仍然被gil锁定,但至少它将它发送到不同的核心)
有更多的地方可以使用它,但是大多数gui已经被事件相当异步地驱动(不完全正确,但足够接近),并且sqlite3查询肯定应该从同一个线程一次执行一次(事实上如果你尝试在两个不同的线程中写入它,sqlite会破坏性的可能)
这可能是一个粗略的过度简化