- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在使用 Python 和 wxPython 来编写应用程序。
我正在考虑实现此目的的方法可能不是最好的 - 如果是这种情况,请告诉我,因为我愿意重构。
现在,我有一个 GUI 表单。主程序开始点实例化 GUI 窗体的一个实例,然后运行 wx.mainLoop(),这会导致应用程序的主初始线程在应用程序的生命周期内阻塞。
我们当然知道,当 UI 中发生事件时,UI 线程会为它们运行代码。
现在,我有另一个线程 - 一个工作线程。该线程需要闲置,然后当 UI 线程中发生某些事情时,例如单击一个按钮,我希望工作线程停止空闲并执行其他操作 - 运行一个函数,例如。
我现在无法想象这一点,但我可以看到随着应用程序变得越来越复杂,还必须在工作线程实际上忙于做某事时向它发出信号。
我对这个设置有两个问题:
while True: pass
的事情会占用 CPU 时间,而类似 while True: time.sleep(0.1)
不允许对事件做出即时 react 。 最佳答案
第一:首先你真的需要一个后台线程来闲置吗?
在大多数平台上,启动一个新线程的成本很低。 (除了在 Windows 和 Linux 上,它非常便宜。)那么,为什么不在需要时启动线程呢? (保留线程列表和保留单个线程一样容易,对吗?)
或者,为什么不创建一个 ThreadPoolExecutor
,然后将作业提交给它,让执行程序担心它们何时运行以及在哪个线程上运行。任何时候您只要考虑“需要在不阻塞主线程的情况下运行的任务”而不是“需要等待工作的工作线程”,您的生活就会变得更轻松。在幕后,仍然有一个或多个工作线程在等待队列,或其他类似的东西,但那部分都是为您编写(并调试和优化)的。您只需要编写任务,它们只是常规函数。
但是,如果你想编写显式的后台线程,你可以,所以我会解释一下。
How can I make my worker thread idle without using up CPU time? … What's the best way to signal into the worker thread to do something?
Threading
中看到各种不同的选项。模块文档,但在大多数情况下,最明显的使用方式是
Condition
.然后向工作线程发送信号的方法是
notify
Condition
.
Queue
简单很多。等待
Queue
,只需调用其
get
方法与
block=True
.要通知另一个线程唤醒,只需
put
关于
Queue
的东西. (在幕后,
Queue
包含
list
或
deque
或其他集合,
Lock
和
Condition
,所以你只需告诉它你想要做什么——检查一个值,阻塞直到有一个值,添加一个值——而不是处理等待和信号以及保护集合。)
I'd have some way for the worker thread to register a callback with the UI itself, so that when a button is clicked or any other UI Event happens, the worker thread is signalled to change what it's doing.
self.queue.put
或
def callback(value): self.value = value; self.condition.notify()
或者作为回调的任何东西,GUI 线程甚至不必知道回调正在触发另一个线程。
I can't envision this right now but I could see as the app gets more complex also having to signal the worker thread while it's actually busy doing something.
Queue
,或
Executor
,会自动为你做。
Condition
或
Event
会做。
Lock
),然后您将设置该标志并通知
Condition
...虽然在某些情况下,您可以将空闲和忙碌的情况合并为一个
Condition
或
Event
(空闲时调用无限
wait()
,忙时快速检查
wait(timeout=0)
)。
futex
或 Windows
CriticalSection
— 在某些情况下,它实际上可能会占用一点 CPU 时间,因为这恰好是一个很好的优化。但关键是,在您准备好使用它之前,您不会要求任何 CPU 时间。
关于python - 设置空闲线程/信令线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16472639/
我有一个需要从远程下载数据的更新服务,但是就像微软的 BITS 我想在用户空闲和/或他们的网络利用率低时执行此操作,以免影响他们的体验. 我需要做什么或看什么?谁能指出我从哪里开始并获得我需要的信息的
我有一个运行良好的 Angular 项目,我正在实现 NG-IDLE 和 KeepAlive,以保持 session 新鲜并在 API session 到期之前注销用户。 我的问题是 ng-idle
我开始使用http://reactphp.org/用于处理 HTTP 请求。 我运行多个在不同端口上运行的 React Worker,然后使用 Nginx 作为负载平衡来处理请求。像这样 upstre
我有一个 ViewController,它将通过 init 请求访问位置服务 if ([CLLocationManager authorizationStatus] == kCLAuthorizati
1 S postgres 5038 876 0 80 0 - 11962 sk_wai 09:57 ? 00:00:00 postgres: postgres my_app
有没有办法在 Python 的 IDLE 中循环打开的窗口?似乎唯一的方法就是转到菜单栏,或者单击所需的窗口。谢谢。 最佳答案 在 Mac OS X 上,如果您使用的是来自与 Aqua Cocoa T
我在 java 中实现了一个邮件监听器,监听器进入 IDLE 直到新邮件到达,它打印电子邮件主题并立即再次返回 IDLE。 我是否有可能错过我发出的两个 IDLE 之间的事件(新电子邮件)? 例如,我
在嵌入式设备中,允许空闲 HTTP 连接保持打开状态的实际时间是多少? 我知道在 1999 年左右的互联网时代,互联网聊天室有时只会保持连接打开并在他们进来时发送回复。在那些日子里,HTTP 连接的空
我正在网页(在弹出窗口中)检查用户状态 - 他是活跃的还是空闲的。如果他空闲超过 30 分钟,窗口将自动关闭并重置数据库中的一些标志。 我设置了包含时间的 cookie(他打开弹出窗口的时间),并在每
我在空闲: >>> import mymodule >>> # ??? 导入模块后: if __name__ == '__main__': doStuff() 我实际上如何从 IDLE 中调用
除了 Sun Java Mail 之外,还有支持 IDLE 命令的 Java IMAP 库吗? 我一直在使用 Sun 的 JavaMail,它运行良好,只是它有相当多的内存开销。 最佳答案 Chilk
我尝试实现一个邮件服务器,使用 sun IMAPFolder 和空闲命令解析传感器发送的电子邮件。 不幸的是,空闲状态在30分钟后关闭并抛出FolderClosedException。为了模拟在空闲重
我有一个 PHP 脚本可以从文本文件中导入各种数据。 导入非常复杂,我的测试文件有 32.000 个条目。这些条目必须被解析并插入到 mysql 数据库中。 如果我要运行我的脚本,它需要 30 分钟才
我正在使用在后端使用 SQL Server 2008 的 Hibernate 开发 Spring REST Web 应用程序。我在 64 位 Windows 机器上使用 Tomcat 6 作为 Web
我对 JS 中的任务运行器非常陌生,这是我第一次尝试 GruntJS。在我的 Gruntfile.js 中,我保留了几个任务,例如 jshint、cssmin 等。我可以从命令行运行它们,但是当我在那
麦克:特立独行 python :3.4 我尝试在 Python 的 IDLE 中测试 timeit 模块 import timeit >>> timeit.timeit( "obj.method",
我的 C# 应用程序在系统启动时运行,必须等待本地 SQL Server 实例才能真正执行任何操作。现在,我只是等待服务器响应(我曾经获得服务的等待句柄,但那不可靠),然后启动应用程序的主对话框。 当
我在服务器上有一个 (bash) 脚本,我继承了它的管理方面,最近发现脚本中的一个缺陷,没有人引起我的注意。 发现问题后,其他人都跟我说这让他们很恼火,但从来没有告诉过我(太棒了。。。) 所以,脚本遵
假设我有一个 websocket 可以随时接收事件,但大部分时间处于空闲状态,初始连接后将消耗多少带宽以使其保持事件状态? 不管怎样,服务器是使用 ws 的 NodeJS,而客户端使用的是 QtWeb
当我打开应用程序时,让它在后台模式下运行很长时间,然后再次打开,然后不久又崩溃了。崩溃日志表明这次崩溃是由MapKit框架引起的。这只发生在设备中... . 有人能理解这个崩溃日志吗?请帮我解决这个问
我是一名优秀的程序员,十分优秀!