多Worker函数
提示
- iOS的js引擎天生是单线程模式,无法实现多线程。
- 这里我们使用多个jsvm的方式实现多个worker进行异步干不同的事情。
- 多jsvm代表这启动多个不同的js虚拟机,在iOS进程中运行,相互之间进程数据是隔离的。
- 每个jsvm独立运行,会将脚本都全部重新加载一次,直到运行运行到main.js中,所以需要通过getCurrentWorkerName函数获取worker名称,分流到不同函数做不同业务
- 每个jsvm之间的数据交互,可以通过一个worker写入到文件,然后另外一个worker进行读取,进行业务处理
- 主脚本jsvm的名称是mainWorker,其他的worker可以自己命名,但是不要用中文、特殊字符等
多Worker模块
getCurrentWorkerName 获取当前worker名称
- 获取当前的worker名称
- @return
{string}
worker的字符串
function main() {
var m = getCurrentWorkerName();
logd(m);
}
main();
workerThread.newWorker 生成一个新的worker
- 新增一个worker
- @param name worker的名称
- @return
{string}
worker的名称 , 有值代表成功
function startNewWorker(workName) {
let name = workerThread.newWorker(workName);
logd("startNewWorker " + name)
sleep(1000)
if (!workerThread.isRunning(workName)) {
logd(workName + " 没运行");
return false
}
return true;
}
function testworker() {
logd("current worker name " + getCurrentWorkerName())
// 脚本的主线程
if (getCurrentWorkerName() == "mainWorker") {
logd("主脚本线程")
// 启动worker1
startNewWorker("worker1");
startNewWorker("worker2");
startNewWorker("worker3");
// 已经运行了
for (let i = 0; i < 10; i++) {
if (isScriptExit()) {
logd("mainworker 退出了")
return
}
sleep(1000)
logd(getCurrentWorkerName() + " --> " + new Date())
// 每2秒调用一次worker1的函数
if (i % 2 == 0) {
let dsx = JSON.stringify({"日期": new Date()});
if (workerThread.hasWorkerFunction("getWorker1Data")) {
let result = workerThread.callWorkerFunction("getWorker1Data", dsx)
logd("worker1" + "#getWorker1Data 返回--->:::: " + result)
let removeWorker1 = workerThread.removeWorker("worker1")
logd("removeWorker1 " + removeWorker1)
logd("isCancelled worker1 " + workerThread.isCancelled("worker1"));
// 移出函数getWorker1Data函数
workerThread.removeWorkerFunction("getWorker1Data")
} else {
logw("无 getWorker1Data 函数,不调用")
}
}
// 每4秒调用一次worker2的函数
if (i % 4 == 0) {
let dsx = JSON.stringify({"日期": new Date()});
let result = workerThread.callWorkerFunction("getWorker2Data", dsx)
logd("worker2" + "#getWorker2Data 返回--->:::: " + result)
}
// 每6秒调用一次worker6的函数
if (i % 6 == 0) {
let dsx = JSON.stringify({"日期": new Date()});
let result = workerThread.callWorkerFunction("getWorker3Data", dsx)
logd("worker3" + "#getWorker3Data 返回--->:::: " + result)
// 停止所有worker线程
workerThread.stopAll()
}
}
} else {
logd("非主脚本线程 ------ ")
// 如果是worker1的线程,让他干别的活
if (getCurrentWorkerName() == "worker1") {
workerThread.addWorkerFunction("getWorker1Data", function (data) {
logd("---->worker1得到的参数 " + data)
return "我是worker1#getWorker1Data 函数返回的数据 " + new Date()
})
while (true) {
if (isScriptExit()) {
logd("worker1 退出了")
return
}
sleep(1000)
//logw(getCurrentWorkerName() + " worker2 " + new Date())
}
}
if (getCurrentWorkerName() == "worker2") {
workerThread.addWorkerFunction("getWorker2Data", function (data) {
logd("---->worker2得到的参数 " + data)
logd("getWorker2Data getCurrentWorkerName " + getCurrentWorkerName())
return "我是worker2#getWorker2Data 函数返回的数据 " + new Date()
})
while (true) {
if (isScriptExit()) {
logd("worker2 退出了")
return
}
sleep(1000)
//logw(getCurrentWorkerName() + " worker2 " + new Date())
}
}
if (getCurrentWorkerName() == "worker3") {
workerThread.addWorkerFunction("getWorker3Data", function (data) {
logd("---->worker3得到的参数 " + data)
return "我是worker3#getWorker3Data 函数返回的数据 " + new Date()
})
while (true) {
if (isScriptExit()) {
logd("worker3 退出了")
return
}
sleep(1000)
//logw(getCurrentWorkerName() + " worker3 " + new Date())
}
}
}
}
testworker()
workerThread.isRunning worker是否正在运行
- 这个worker是否正在运行
- @param name worker 名称
- @returns
{boolean}
true 代表正在运行,false 代表没运行
// 请看 newWorker 例子
workerThread.hasWorkerFunction 是否有worker函数
- 是否有worker函数
- @param funcName 函数名称
- @returns
{boolean}
true代码有 false代表无
// 请 看 newWorker 例子
workerThread.addWorkerFunction 增加worker函数
- 新增一个工作函数给别的worker调用
- @param funcName 函数名称
- @param @param callback 实际的实现,建议参数和返回值都是字符串
- @returns
{boolean}
true 代表成功 false代表失败
// 请看 newWorker 例子