到目前为止,没有人(甚至GAE文档)都没有能够清楚地描述推送队列和拉取队列之间的区别.
我的理解是Task Queue API允许您定义可以将工作排入的任务队列.不知何故,这与GAE的自动缩放功能一起使用,因此您无需显式管理消耗这些队列任务的工作线程数:GAE就是为您完成的.
但是我无处可寻找推送和拉取队列之间差异的"King's English"描述.什么是"推队"推?什么是"拉队列"拉?它们都配置在里面queues.xml吗?
我正在尝试生成线程(使用新的 Nodejs 模块“worker_threads”)并向每个线程传递一个复杂对象,该对象是 Puppeteer browser.newPage() 实例的“页面”对象。我尝试使用 workerData 和 MessageChannels - 来自文档:
port.postMessage:向该通道的接收端发送一个 JavaScript 值。值将以与 HTML 结构化克隆算法兼容的方式传输。特别是,它可能包含循环引用和对象,如 JSON API 无法字符串化的类型化数组。
但我总是收到错误:
(node:7133) UnhandledPromiseRejectionWarning: DataCloneError: function () { [native code] } 无法克隆。在 Worker.postMessage (internal/worker.js:378:23)
我还尝试将它字符串化并解析它,但页面对象还包含我无法从线程上下文中评估的函数(我也想避免使用 eval())。
问题是:如何将像 Puppeteer browser.newPage() 实例这样的复杂对象传递给 Nodejs 中使用 worker_threads 产生的线程?
我对intentService有点困惑.文档说如果你发送一个intentService多个任务(意图),那么它将在一个单独的线程上一个接一个地执行它们.我的问题是 - 是否可以同时拥有多个intentService线程?如何区分在同一个intentService(同一个线程)上创建三个不同意图的代码,或三个单独的intentServices,每个都有自己的线程和一个意图执行?
换句话说,当您执行命令startService(intent)时,您是将意图放在单个队列中还是每次都启动一个新队列?
Intent someIntent1 = new Intent(this, myIntentService.class);
Intent someIntent2 = new Intent(this, myIntentService.class);
Intent someIntent3 = new Intent(this, myIntentService.class);
startService(someIntent1);
startService(someIntent2);
startService(someIntent3);
Run Code Online (Sandbox Code Playgroud) multithreading android worker-thread android-service android-intentservice
我有一个需要大量初始化的对象(在一台强壮的机器上1-2秒).虽然一旦初始化,只需要大约20毫秒来做一个典型的"工作"
为了防止每次应用程序想要使用它时重新初始化它(可能是每秒50次,或者在典型使用中几分钟都没有),我决定给它一个工作,并让它运行在它自己的线程上,检查在que中是否有任何工作.但是,我不完全确定如何创建一个无论是否有工作运行的线程.
这就是我到目前为止所做的任何批评都受到欢迎
private void DoWork()
{
while (true)
{
if (JobQue.Count > 0)
{
// do work on JobQue.Dequeue()
}
else
{
System.Threading.Thread.Sleep(50);
}
}
}
Run Code Online (Sandbox Code Playgroud)
经过深思熟虑:我以为我可能需要优先杀死这个线程让它永远运行,所以我想我会添加一个告诉线程结束的Job类型.关于如何结束这样的线程的任何想法也赞赏.
为了上下文化,我想通过 NodeJS“worker_thread”模块中的工作线程使用类实例函数。
在一个main.js文件中,我声明一个类并实例化一个新的 Worker,并通过选项传递新实例workerData。
main.js
const { Worker } = require('worker_threads');
class obj {
constructor() {
this.a = "12";
this.b = 42;
}
c() {
return 'hello world';
}
}
let newobj = new obj();
console.log({
a: newobj.a,
b: newobj.b,
c: newobj.c()
});
//Output: { a: '12', b: 42, c: 'hello world' }
let worker = new Worker('./process.js', { workerData: { obj: newobj } });
worker.once('message', res => { console.log({ res }) });
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,工作人员调用了process.js脚本。让我们看看吧。 …
javascript multithreading worker-thread node.js node-worker-threads
有没有办法在两个工作线程之间创建直接通信通道new MessageChannel?例如:P我使用worker_threadAPI 创建了一个主线程,它创建了两个工作线程W1并W2
P -> W1
-> W2
Run Code Online (Sandbox Code Playgroud)
我想直接启用W1和之间的通信W2,而不是通过P使用parentPort.
我正在写一个小聊天应用程序,我有这个事件处理程序:
void o_Typing(object sender, EventArgs e)
{
MessageBox.Show("Fired!");
this.Text = "Fired!";
}
Run Code Online (Sandbox Code Playgroud)
o_Typing是派生自的类中的方法TabPage.基本上,我希望每个对话都有自己的标签.
事件处理程序由我的Chat对象触发,该对象在另一个线程中运行.我有一个用于UI的线程,另一个用于每个聊天对话的线程(用于轮询服务器以获取新数据)
当事件被触发时,会MessageBox弹出,但Tab标题不会更改.事件触发一次之后,它再也不会触发,导致我相信事件是在工作线程中调用的,尽管它是在UI线程中定义的.
如何从工作线程调用我的事件,并使用Invoke()它们在UI线程上执行?
我一直在阅读有关 NodeJS 上的多处理以获得最好的理解并尝试使用我的代码在繁重的环境中获得良好的性能。
虽然我了解利用资源处理负载的不同方式的基本目的和概念,但随着我深入研究,一些问题出现了,似乎我无法在文档中找到特定的答案。
单线程中的 NodeJS:
NodeJS 运行一个我们称之为事件循环的单线程,尽管在后台操作系统和 Libuv 正在处理 I/O 异步任务的默认工作池。
尽管工作人员可能使用不同的核心,但我们应该为事件循环使用单个核心。我想它们最终是由操作系统调度程序排序的。
NodeJS 作为多线程:
使用“worker_threads”库时,在同一个单进程中,每个线程运行不同的v8/Libuv实例。因此,它们共享相同的上下文并在具有“消息端口”和 API 其余部分的线程之间进行通信。
每个工作线程运行其事件循环线程。线程应该在 CPU 内核之间明智地平衡,从而提高性能。我想它们最终是由操作系统调度程序排序的。
问题 1:当工作人员使用 I/O 默认工作人员池时,是否以某种方式共享与其他工作人员池相同的线程?或者每个工人都有自己的默认工人池?
多处理中的NodeJS:
使用“集群”库时,我们将工作拆分到不同的进程中。每个进程都设置在不同的核心上以平衡负载......好吧,主事件循环最终设置在不同的核心中,因此它不会与另一个重事件循环共享核心。这样做听起来很聪明。
在这里,我将与一些 IPC 策略进行交流。
问题 2:这个 NodeJS 进程的默认工作池?他们在哪里?在第一种情况下如预期的那样在其余核心之间保持平衡?然后我猜它们可能与集群的其他工作池位于相同的核心上。说我们正在平衡主线程(事件循环)而不是“进程”不是更好吗?
说了这么多,主要问题是:
问题三:clustering好还是worker_threads好?如果两者都在同一代码中使用,那么两个库如何才能获得最佳性能?或者他们只是可以简单地发生冲突?或者最终是控制权的操作系统?
我有一个MFC应用程序,它有一个工作线程,我想要做的是将消息从工作线程发布到主GUI线程,以更新GUI上的一些状态消息.到目前为止我所做的是Registered a new window message
//custom messages
static UINT FTP_APP_STATUS_UPDATE = ::RegisterWindowMessageA("FTP_APP_STATUS_UPDATE");
Run Code Online (Sandbox Code Playgroud)
将此消息添加到对话框类的消息映射中
ON_MESSAGE(FTP_APP_STATUS_UPDATE, &CMFC_TestApplicationDlg::OnStatusUpdate)
Run Code Online (Sandbox Code Playgroud)
原型OnStatusUpdate是
afx_msg LRESULT OnStatusUpdate(WPARAM, LPARAM);
Run Code Online (Sandbox Code Playgroud)
和定义是
LRESULT CMFC_TestApplicationDlg::OnStatusUpdate(WPARAM wParam, LPARAM lParam)
{
//This function is not called at all.
return 0;
}
Run Code Online (Sandbox Code Playgroud)
而工作线程调用代码是
void CMFC_TestApplicationDlg::OnBnClickedMfcbutton1()
{
ThreadParams params;
params.m_hWnd = m_hWnd;
params.FTPHost = "test_host";
params.FTPUsername = "test";
params.FTPPassword = "test";
AfxBeginThread(FTPConnectThread,¶ms);
}
Run Code Online (Sandbox Code Playgroud)
和Worker线程代码是
//child thread function
UINT FTPConnectThread( LPVOID pParam )
{
if(pParam == NULL)
{
return 0;
}
ThreadParams *params = …Run Code Online (Sandbox Code Playgroud) 我目前正在开发一个GUI软件项目,用于使用Qt可视化3D场景.GUI允许用户将批量的3D数据文件(例如.obj)与.mtl支持和.stl以及2D图像文件一起加载到场景中,作为在QGLWidget派生的窗口小部件上呈现的SceneObject类对象.
然而,当我在主GUI线程上批量加载它们时,加载时间过长会导致GUI冻结,这很难看.我尝试在单独的线程上执行加载,但有一个很大的问题:当加载.obj纹理或图像文件时,我还将在加载每个图像或纹理后立即使用OpenGL glBindtexture()执行绑定,这样我只需要保存每个SceneObject实例中的纹理ID.当我尝试在工作线程中执行加载时,整个程序就会崩溃.
我已经读过,每个线程只能访问一个OGL上下文,并且跨线程的上下文切换是实现我想要做的事情的一种危险方式.另一种可能的方法是在加载完成后在GUI线程上执行纹理绑定,但这意味着我的SceneObject类完全重新设计:(
任何人都可以给我一些关于如何实现加载线程以将资源加载到OpenGL场景的建议吗?
worker-thread ×10
node.js ×4
c# ×2
javascript ×2
.net ×1
android ×1
api ×1
c++ ×1
events ×1
java ×1
mfc ×1
opengl ×1
postmessage ×1
qt ×1
task-queue ×1
threadpool ×1