javascript - 如何暂停网络 worker

标签 javascript multithreading cordova web-worker

我已尝试查看 web-worker 文档,虽然我没有找到我要找的东西,但文档也不是很好,所以我想我只是问问它。

我正在使用 Cordova 开发移动应用程序与外部设备对话。我需要每秒向外部设备发送一些命令。为此,我设置了 Web Workers,它基本上相当于 JavaScript 中的线程。但是有一个命令,要工作,必须转弯外部设备。也就是说,如果设备在尝试处理它时收到任何其他命令,该命令将失败。为此,我只想暂停我的线程。

在 Java 中这很容易。有一个 public void thread.suspend(),然后是 thread.resume()。我的自然倾向是 Web Workers 会将此作为默认功能。 Worker.suspend()、worker.resume(),但我找不到任何文档支持 Workers 有这个想法,尽管这是对多线程的普遍期望。有这样的固有功能吗?如果没有,是否有实现类似功能的最佳实践?

最佳答案

这段代码展示了如何

  1. 创建三个网络 worker
  2. 从网络 worker 那里获取计数器值
  3. 暂停网络 worker
  4. 检测所有三个 web worker 何时停止
  5. 重启网络 worker

由于 StackOverflow 片段的限制,网络 worker 代码是内联的。

function getInlineJS() {
    var js = $('[type="javascript/worker"]').text();
    var blob = new Blob([js], {"type": "text/plain"});
    return URL.createObjectURL(blob);
}

var worker_list = [];
var worker_num = 3;
var pause_count = null;

function create_workers() {
    var index;
    for (index = 0; index < worker_num; index++) {
        var web_worker = new Worker(getInlineJS());
        var counter_selector = '#counter' + (index + 1);
        (function(selector) {
            web_worker.onmessage = function(event) {
                var paused = event.data['paused'];
                if (paused) {
                    pause_count++;
                }
                if (pause_count == worker_num) {
                    // At this point we know the workers have all stopped
                    $('#pause_count').text(pause_count);
                }
                var counter = event.data['counter'];
                $(selector).text(counter);
            }
        })(counter_selector);
        worker_list.push(web_worker);
    }
}

/**
 * Send a bogus message to get the workers to send their counters
 */
function update_counters() {
    var index;
    for (index = 0; index < worker_num; index++) {
        var message = {'index': index};
        worker_list[index].postMessage(message);
    }
}

/**
 * Send the pause flag to the workers
 * @param pause_state
 */
function pause_counters(pause_state) {
    var index;
    for (index = 0; index < worker_num; index++) {
        var message = {'pause_flag': pause_state};
        worker_list[index].postMessage(message);
    }
}

var pause_state = false;
$(document).ready(function() {
    create_workers();
    setInterval(update_counters, 1000);
    $('#pause').on('click', function() {
        pause_state = !pause_state;
        if (pause_state) {
            pause_count = 0;
        }
        else {
            $('#pause_count').text('');
        }
        pause_counters(pause_state);
        $('#pause').text(pause_state ? 'Start' : 'Stop');
    });
});
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Web Worker</title>
</head>
<body>
    <div class="counter">
        Counter 1: <span id="counter1"></span>
    </div>
    <div class="counter">
        Counter 2: <span id="counter2"></span>
    </div>
    <div class="counter">
        Counter 3: <span id="counter3"></span>
    </div>
    <div class="button">
        <button id="pause" type="button">Stop</button>
    </div>
    <div>
        Pause Count: <span id="pause_count"></span>
    </div>
</body>
<script src="https://code.jquery.com/jquery-3.1.1.js"
        integrity="sha256-16cdPddA6VdVInumRGo6IbivbERE8p7CQR3HzTBuELA="
        crossorigin="anonymous"></script>
<script src="sync.js"></script>
<script type="javascript/worker">
var pause_flag = false;
var counter = 0;

function run_command() {
    if (!pause_flag) {
        counter++;
    }
}

var interval = setInterval(run_command, 1000);

onmessage = function(event) {
    if ('pause_flag' in event.data) {
        pause_flag = event.data['pause_flag'];
    }
    var message = {
        "paused": pause_flag,
        "counter": counter
    };
    postMessage(message);
};
</script>
</html>

关于javascript - 如何暂停网络 worker ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40181746/

相关文章:

java - 使用显式锁避免死锁会出现异常

c++ - 如何将两个值相乘并以原子方式存储结果?

cordova - Ionic 错误,无法验证第一个证书

javascript - 在输入文本表单旁边添加标签

javascript - 如何从 Chrome 扩展的选项页面启用/禁用 manifest.json CSS 内容脚本?

javascript - 使用 Node js Await/Async 函数

javascript - 保护 JavaScript 对象免受外部脚本的影响

java - CountDownLatch 的 latch.await() 方法与 Thread.join()

android - 我想用 PhoneGap 创建一个 Objective-C 组件

html - <Span> 不是 block 文本