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