线程 双向通信

110 阅读1分钟

js语言采用的是单线程,所有的任务只能在一个线程上完成,一次只能做一件事,前面的任务没有完成,后面的只能等待   webworker 为js创建多线程环境,主线程创建一个worker线程,将一些耗时任务分配给worker线程,等到worker线程执行完之后,再把结果给主线程

// 1、1.js 是当前主线程的worker线程
        var worker = new Worker('./1.js');
  


        // 线程通信
        // 向worker线程传递信息
        worker.postMessage({msg: '我是从主线程来的', count: 1000000})

  
 
        // 接收worker线程传递过来的计算结果
        worker.onmessage = function(res) {
            console.log('主线程里面接收的子线程的结果', res.data);
        }
        console.log(3333333);
// 监听接收主线程传递的信息  self 自己  代表当前子线程

self.onmessage = function (res) {

    console.log('子线程接收到的东西是', res.data);
    
    for (let i = 0; i < res.data.count; i++) {
        count += i;
    }

 
    console.log(count);
    postMessage(count)

}

网络通讯协议

        http https  有一个缺陷:通信(请求)只能由客户端(浏览器、前端)发起

        前端向后端发送请求,后端接收到之后,返回一个结果;后端是无法主动向前端发送信息的

        轮询(每隔一段时间,发送一个请求)客户端每隔一段时间,向服务端发送一次请求,看看服务端有没有新的信息。  经典场景:聊天室、大屏可视化里面的数据

        轮询缺点:有延迟、效率低下、非常浪费资源(需要不断地向服务端发送请求询问是否有新的数据)

        ws  wss   协议标识符

        webSocket(ws) 双向通讯  前端可以向服务端发送信息,服务端可以主动向前端推送信息,没有同源限制,客户端可以和任意服务器通信

<textarea id="content" cols="30" rows="10"></textarea>

     <button id="send">发送信息</button>
// 1、和websocket服务器建立连接

        var ws = new WebSocket('ws://192.168.204.63:3011');

        // 建立成功
        ws.onopen = function() {
            console.log('连接成功!');
        }

  
        // 建立失败
        ws.onerror = function() {
            console.log('连接失败!');
        }
        

         send.onclick = function() {
            ws.send(content.value);
        }
        

        // 接收服务器推送的信息
        ws.onmessage = function(res) {
            console.log(res);
        }