问题标签 [worker-thread]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
326 浏览

multithreading - 最大化工作线程利用率

为了解决一个问题(以及更好地理解多任务处理),我编写了一个小型线程池实现。这个线程池启动了一些工作线程,当线程池的客户端添加任务时,这些线程会从队列中弹出任务。出于此问题的目的,当任务队列为空时,工作线程全部终止。

在做了一些基本的基准测试之后,我发现应用程序花费了大约 60% 的时间来等待获取队列锁。大概这主要发生在工作线程中。

这仅仅是表明我没有给工作线程足够的工作,还是更多?我可能缺少一些简单的东西来增加工作线程的吞吐量吗?

编辑:这是一些粗略的伪代码,应该可以说明一些事情。这是在工作线程执行期间获取/释放锁的仅有的两个地方(这是应用程序运行时间的绝大部分。)

0 投票
5 回答
8106 浏览

php - 403 Forbidden with php in worker mode。仅来自浏览器的 php 文件

首先让我先说是的,我已经在谷歌和stackoverflow中搜索过这个,我找到了很多答案并尝试了所有答案。在这一点上,我相信我唯一的资源是自己发布问题,即使场景听起来重复,请善意地尝试提供帮助。

这种情况非常基本,在 Ubuntu 桌面 10.04 上,我根据本指南及其衍生产品在这里通过 Synaptic 和 Php5 设置了 apache 。此时,如果我在命令行上调用一个 php 脚本,它就可以工作,例如:

输出我的 hello world 没有任何问题。但是,如果我去 Firefox 并指向 test.php,它将显示 403 错误 Forbidden ...

我已将 /var/、/var/www/ 和 /var/www/test.php 的所有权更改为我能想到的每个变量(www-data [apache 以此用户身份运行]、purefan [我的普通用户]、root ) 没什么区别,我也改了好几次权限 777、0777(为了安全起见)、644、755,没变。从 CLI 我将 phpinfo 放入一个文件并将其添加到此处

如果我没记错的话,当 Apache 调用 php 解释器时,问题正在发生,当我访问http://localhost/index.php时,它会显示 apache 的默认“它可以工作!” 页面,但是如果我将 php 内容添加到该文件中,它只会被忽略,但不会显示任何错误(还检查了错误日志和系统日志)。

因此,如果您有任何建议,请告诉我,这不是生死攸关的事情,而是真的想使用 worker 而不是 prefork 进行设置。

感谢您的时间

0 投票
4 回答
1364 浏览

c# - C#中的基本多线程问题

我是多线程的新手,我正在处理我的应用程序中的一个区域。我已经阅读了该网站上的许多帖子,但我仍然对解决问题的最佳方法感到困惑:

[1] 在 .NET 3.5 中,ThreadPool程序利用机器中的多核是唯一的方法吗?即是否可以使用在不同的核心上产生线程new Thread()

[2] 我的案例:我有List<Calculation>大约 80 个项目,目前按顺序处理。因此,鉴于我正在使用 .NET 3.5 并且根据我所读到的内容,ThreadPool由于线程数量众多,这可能是我对多线程的最佳选择,但是:

  • 计算之间有很多依赖关系。目前,列表的排序方式是在开始时执行所有必需的计算。

这就是工作项的依赖关系的样子(细节并不重要,只是想说明依赖关系的复杂性):

替代文字

  • 计算时间差别很大,一个 Calculation 对象可能只涉及检索值,其他 Calculation 对象将涉及嵌套循环中的大量工作......等等

我如何Calculations根据它确定具有 10 多个其他工作项的主要内容的优先级?什么是最有效的信号使用方式?

谢谢你。

编辑:我应该提到它List<Calculation>仍然是固定的。但是,计算 80+ 次计算称为 x 百万次。每次更新迭代器时,都会Calculation在列表中的每一个上调用Calculate()。

0 投票
3 回答
2978 浏览

scala - Scala,检查 Actor 是否已退出

在 Scala 2.8 中,当我启动演员时,我可以通过消息传递进行通信。这反过来意味着我可以发送最终的 Exit() 消息或任何我认为适合我的协议的消息。

但是我将如何检查演员是否已经退出?我可以很容易地想象自己有一个任务,其中一个主演员启动一些工人演员然后只是等待答案,每次检查这是否是最终答案(即是否有任何演员仍在工作或他们都退出了?)。

当然,我可以让他们都发回“我完成了”的消息,然后计算他们,但这有点不满意。

测试worker-actors完成时的最佳实践是什么?

编辑#1

我正在研究期货,但遇到了麻烦。有人可以解释为什么这段代码不起作用:

如果我在 future-body 中定义函数 fib,它就可以工作。它必须是一个范围的东西,但我没有得到任何上述错误,它只是挂起。任何人?

编辑#2

扩展 Application 似乎不是一个好方法。定义一个主要方法使一切正常。下面的代码是我一直在寻找的,所以Futures竖起大拇指 :)

0 投票
3 回答
1435 浏览

c++ - 如何使用 IOCP 将用户定义的数据传递给工作线程?

嘿...我使用 I/O 完成端口和 winsock 创建了一个小型测试服务器。我可以成功连接套接字句柄并将其与完成端口相关联。但我不知道如何将用户定义的数据结构传递到工作线程......

到目前为止,我尝试的是(ULONG_PTR)&structure as在关联调用中将用户结构作为完成键传递,CreateIoCompletionPort() 但这不起作用。

现在我尝试定义自己的 OVERLAPPED 结构并使用 CONTAINING_RECORD(),如此处所述http://msdn.microsoft.com/en-us/magazine/cc302334.aspxhttp://msdn.microsoft.com/en-us /杂志/bb985148.aspx。但这也行不通。(我得到 pHelper 内容的怪异值)

所以我的问题是:如何使用 WSARecv()、GetQueuedCompletionStatus() 和 Completion 数据包或 OVERLAPPED 结构将数据传递给工作线程?

编辑:我怎样才能成功传输“每个连接数据”?...似乎我做错了艺术(如上面两个链接中所述)。

这是我的代码:(是的,它很丑,也是唯一的测试代码)

0 投票
1 回答
705 浏览

javascript - HTML5 工作线程功能是否公开了机器上的内核数量?

我正在使用 HTML5工作线程,我想根据可用内核划分一些工作。有没有办法从 JavaScript 获取机器上的内核数?

0 投票
1 回答
227 浏览

java - 处理加载活动线程的最佳实践

当工作线程正在加载我的游戏时,我有一个显示加载屏幕的活动。在加载工作线程时,更新活动上的文本视图以显示其当前状态。完成后,它将关闭加载活动并开始实际的游戏活动。工作线程在 onCreate() 方法中创建,并被赋予一个新创建的处理程序。

然而,当活动被破坏并重新启动时会发生什么,例如通过方向改变?恕我直言,onCreate() 方法会在第一个仍在加载时创建一个新的工作线程,所以现在我有多个工作线程在做同样的事情。

防止这种情况并通知工作线程有关新活动的最佳方法是什么(以便它可以发布其状态更新)。

0 投票
3 回答
249 浏览

java - 使用工作线程时的返回语句

我是否总是必须在 Swing 中使用 Worker Thread 返回一些东西?如果我没有任何返回值怎么办?我只是想使用工作线程来运行一个无限的for循环......那么返回什么?即使我在无限for循环之后写了一个虚拟的return语句,比如for return 0; 然后它也可能会说“代码无法访问”。

0 投票
2 回答
2784 浏览

android - Android:从 PacketListener 工作线程中更新 ArrayAdapter / ListView

我正在为 Android 应用程序实现 XMPP 客户端。为了获取发送给我的聊天消息,我使用了 Smack 的 PacketListener。使用应用程序的 XMPP 部分,一切正常。我可以发送和接收消息。但我在显示收到的消息时遇到问题。

为了显示消息,我的应用程序使用将它们绑定到 ListView 的 ArrayAdapter。适配器本身工作正常,因为它显示我发送的消息没有任何问题。但收到的消息并非如此。如果与 UI 发生某些交互,它们只会显示。显然,这是一个线程问题。

如果我没有被 Javadoc 和 Debugger 告诉我的内容弄错,PacketListener.processPacket() 方法在自己的线程中运行,并且 ListView 的更新仅在 Handler 有下一件事情要做并因此处理时才执行它。我现在的问题是,我怎样才能告诉 Handler 立即处理它?这个工作线程和主线程之间的通信是如何工作的呢?由于我自己没有制作 Runnable,所以我不知道如何处理。

这是代码:

0 投票
1 回答
2527 浏览

c++ - 有没有办法在 Qt GUI 应用程序的工作线程中使用 OpenGL 安全地绑定纹理?

我目前正在开发一个使用 Qt 可视化 3D 场景的 GUI 软件项目。GUI 允许用户将批量 3D 数据文件(例如具有某些 .mtl 支持的 .obj 和 .stl 以及 2D 图像文件作为 SceneObject 类对象加载到场景中,这些对象在 QGLWidget 派生的小部件上呈现。

然而,当我在主 GUI 线程上批量加载它们时,较长的加载时间会导致 GUI 冻结,这很难看。我曾尝试在单独的线程上执行加载,但有一个大问题:加载 .obj 纹理或图像文件时,我还将在加载每个图像或纹理后立即使用 OpenGL glBindtexture() 执行绑定,这样我只需要保存每个 SceneObject 实例中的纹理 ID。当我试图在工作线程中执行加载时,整个程序就会崩溃。

我读过每个线程只能访问一个 OGL 上下文,并且跨线程的上下文切换是实现我想要做的一种但危险的方式。另一种可能的方法是在加载完成后在 GUI 线程上执行纹理绑定,但这意味着对我的 SceneObject 类进行完全重新设计:(

谁能给我一些关于如何实现将资产加载到 OpenGL 场景中的加载线程的建议?