【微信小程序】小程序的双线程架构,为什么要设计成双线程的,双线程之间如何通信

在开始学习之前,建议看一下官方文档

逻辑层和渲染层

微信小程序是双线程的,有渲染层和逻辑层两个执行环境,渲染层负责页面的渲染和样式,逻辑层负责小程序的逻辑和数据处理。

  1. 渲染线程:渲染层使用了 WebView 负责渲染界面,包括解析 wxml,wxss,样式计算,布局排版和绘制试图等操作。
    1. 一个页面是一个 WebView ,所以渲染层会有多个webview
  2. 逻辑线程:基于有 JsCore 运行 js 脚本,负责处理业务逻辑和数据处理,包括调用小程序的API、处理事件,请求网络等

为什么要设计成双线程的?

  1. 将渲染线程单独分离,可以确保小程序在进行界面渲染和用户交互时能够保持流畅,不会阻塞。
  2. 将逻辑线程单独分离,可以确保小程序在进行逻辑处理时不会影响到界面的渲染和响应。
  3. 双线程架构的优势
    1. 提高响应速度:两个线程互不影响
    2. 性能优化:将界面渲染和逻辑处理分开,可以更好的利用设备的多核处理器资源,提高小程序的整体性能
    3. 提升用户体验:页面打开更加流畅

渲染层和逻辑层具体如何通信

        本来以为这个底层逻辑没有人问,但是还是被我在面试中遇到了,我一脸懵

  1. 两个线程的通信会经过微信的客户端【Native】 做中转,逻辑层发送网络请求也经由 Native 转发
  2. 逻辑层,通过调用 setData 函数将数据传递到渲染层
  3. 两个线程之间的通信基于微信提供的 WeiXinJsBridge 
    1. 关于 jsBridge 可以参考这篇文章,大同小异
    2. 其实很好理解,渲染层是 webview,逻辑层是【原生】,所以二者的通信原理和开发原生 app 和 h5 的通信是一样的
    3. 每次调用 setData 都需要进行一次线程见的通信,所以在小程序的优化手段中有一个就是,尽量减少 setData 的调用
    4. 关于 setData 请看官网文档

参考

微信小程序双线程模型 - 知乎

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
线程 求质数 返回数组中的最大值 bool isPrime(long x) { if (x <= 1) return false; if (x == 2) return true; for (long i = 2; i <= ceil(sqrt((long double)x));i++) if (x%i == 0) return false; return true; } DWORD WINAPI findPrime(void* p) { long result=0; int l = stc(p)->lower, u = stc(p)->uper; int t_id=GetCurrentThreadId(); for (int i = l; i <= u;i++) if (isPrime(i)) { result++; } DWORD dReturn = WaitForSingleObject(mutex_mul_result_h, INFINITE); mul_result += result; ReleaseMutex(mutex_mul_result_h); //EnterCriticalSection(&gCRITICAL_SECTION_Printf); //printf("%d,%d,%d,%d\n", l, u, result,t_id); //fflush(stdout); //LeaveCriticalSection(&gCRITICAL_SECTION_Printf); return 0; } //dispatcher void dispatch() { DWORD Status; timer tm; tm.start(); //srand(time(NULL)); long step = STEP;//ceil(double(TEST/10)); handlenum = 0; for (int i = 1; i <= TEST;) { i += step; handlenum++; } handle_array=new HANDLE[handlenum]; Thread_id = new DWORD[handlenum ]; arg = new FP_ARG[handlenum]; InitializeCriticalSection(&gCRITICAL_SECTION_Printf); mutex_mul_result_h = CreateMutex(NULL, false, mutex_mul_result); handlenum = 0; for (int i = 1; i <= TEST;) { arg[handlenum].lower = i; arg[handlenum].uper = (i + step-1>TEST) ? TEST : i + step-1; handle_array[handlenum]=(HANDLE)CreateThread(NULL, 0, findPrime, &arg[handlenum], 0, &Thread_id[handlenum]); /*EnterCriticalSection(&gCRITICAL_SECTION_Printf); printf("lower:%d uper:%d thread_id:%d\n", arg[handlenum].lower, arg[handlenum].uper,Thread_id[handlenum]); LeaveCriticalSection(&gCRITICAL_SECTION_Printf);*/ i += step; handlenum++; } tm.stop(); Sleep(1000); printf("there are %d threads\n", handlenum); printf("the multithreads use %f msc\n", tm.read()); } //the number of 1-1000000 Primenumber void s_finePrime() { timer tm; long result = 0; tm.start(); for (int i = 1; i <= TEST; i++) if (isPrime(i)) result++; tm.stop(); printf("Single thread result is %d\n", result); printf("Single thread use %f msc\n", tm.read()); } int _tmain(int argc, _TCHAR* argv[]) { dispatch(); WaitForMultipleObjects(handlenum, handle_array, true, INFINITE);//不起作用 printf("the multithreads reslut is %d\n", mul_result); CloseHandle(mutex_mul_result_h); DeleteCriticalSection(&gCRITICAL_SECTION_Printf); s_finePrime(); system("pause"); return 0; }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值