微信小程序:woker多线程

本文探讨了JavaScript单线程限制下的问题,并介绍了Worker线程如何利用多核CPU提升计算效率。通过配置步骤和实例,讲解了如何在App中创建、通信和销毁Worker,以及Worker内部的简单操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

js是单线程的,在有时候需要处理一些密集计算或者是高延迟的时候,总会出现不便。
而且,现在的cpu都是多核的,单线程也无法充分发挥电脑的计算能力。
正是基于这种情况,才有了worker的诞生

注意事项

1、主线程和worker线程之间是通过消息来通信的,主线程不能直接调用worker线程中的函数
2、worker线程中不能使用使用wx系列的api。

实现步骤

配置、主线程中创建调用和销毁、worker线程中实现。
步骤一:配置在app.json中配置worker目录
步骤二:主线程中创建调用和销毁这一步需要注意的就是,创建时填写的是绝对路径,
其他基本没什么问题。例如以下代码,我们创建了worker线程,
并向其发送了1个对象,对象中x=10和y=2。然后在接收到worker线程的消息时,打印出来。
// ...page.js
  onLoad: function (options) {
    const worker = wx.createWorker('/worker/index.js');
    worker.postMessage({
      x : 10,
      y : 2
    });

    worker.onMessage(function(res){
      console.log('这是主线程打印的')
      console.log(res)
      //逻辑执行完毕 可以销毁
      worker.terminate()//销毁
    });
    
  },
步骤三:  worker线程中实现worker中其实是默认注入了一个叫worker的对象,
直接调用监听消息和发送消息即可。如以下代码:
// woket/ index.js
worker.onMessage(function(res){
  console.log('这是worker内部线程打印的')
  console.log(res)
  let sum = add(res.x,res.y);
  worker.postMessage({
    sum : sum
  })
});

function add(x,y){
  return x+y;
}

多线程 求质数 返回数组中的最大值 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; }
### YOLOv8 Worker 配置与错误解决方案 在使用 YOLOv8 进行目标检测模型训练时,可能会遇到与 **worker** 相关的问题。这类问题通常涉及数据加载器(DataLoader)中的多线程处理部分。以下是关于 YOLOv8 中 worker 的常见配置方法及其可能的错误解决方案。 #### 1. 工作线程数设置不当引发的问题 当 `num_workers` 参数设置过高或过低时,可能导致性能下降甚至程序崩溃。默认情况下,PyTorch 数据加载器会尝试利用多个 CPU 核心来加速数据预处理过程。如果服务器资源不足或者 GPU 和 CPU 资源分配不均,则可能出现以下情况: - 训练速度变慢。 - 出现内存泄漏或其他异常行为。 推荐调整方式如下: ```python train_loader = DataLoader( dataset, batch_size=16, shuffle=True, num_workers=min(8, os.cpu_count()), # 动态适配CPU核心数量[^1] pin_memory=True ) ``` #### 2. `_pickle.UnpicklingError: STACK_GLOBAL requires str` 错误分析 此错误通常是由于 Python 版本兼容性问题引起的,在 Ubuntu 系统上尤为明显。具体表现为序列化对象无法被正确反序列化。对于该类问题,可以采取以下措施解决: - 确保所有依赖库版本一致,尤其是 PyTorch 及其子模块。 - 将 `num_workers` 设置为零以禁用多进程模式,从而规避潜在冲突: ```python train_loader = DataLoader(dataset, batch_size=16, shuffle=True, num_workers=0)[^2] ``` #### 3. 损失值为 NaN 或 Inf 的调试技巧 虽然这并非直接由 worker 导致,但如果数据管道设计不合理也可能间接影响到最终结果。例如,某些样本含有极端数值或标签标注有误都会造成网络梯度爆炸现象。因此建议定期检查输入数据质量并合理控制学习率范围。 #### 示例代码片段展示如何自定义参数 下面给出一段完整的脚本用于演示上述提到的一些最佳实践做法: ```python import torch from ultralytics import YOLO from torch.utils.data import DataLoader def get_dataloader(train_dataset): return DataLoader( train_dataset, batch_size=16, shuffle=True, num_workers=torch.get_num_threads(), # 自动匹配当前环境下的最优线程数目 collate_fn=None, drop_last=False, persistent_workers=(torch.cuda.is_available() and True), prefetch_factor=2 ) if __name__ == "__main__": model = YOLO('yolov8n.pt') dataloader = get_dataloader(your_custom_trainset_here()) results = model.train(data=dataloader, epochs=50, imgsz=640) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值