找回密码
 立即注册

微信登录

只需一步,快速开始

QQ登录

只需一步,快速开始

查看: 50|回复: 0

[心得] aardio 并行任务处理

[复制链接]
  • TA的每日心情
    开心
    12 小时前
  • 签到天数: 74 天

    连续签到: 5 天

    [LV.6]常住居民II

    39

    主题

    79

    回帖

    1030

    积分

    钻石会员

    积分
    1030
    来自: 中国江苏南京
    发表于 6 天前 | 显示全部楼层 |阅读模式 来自: 中国江苏南京
    非业余 - aardio 编程语言 - 非官方问答社区
    风行者三期培训:Aardio+Python+Flutter,1000集课程让你成为全栈开发高手!https://mp.weixin.qq.com/s/_WOoHFtITUyLk2k7BXYGkg
    Aardio培训大揭秘,轻松上手打造个人项目!https://mp.weixin.qq.com/s/cr47qhp_Cpz0p57lbbPwug
    aardio风行者第二期培训班https://mp.weixin.qq.com/s/uB6XHUDnGSk0JlWuiBE9AA
    aardio风行者第三期培训班https://mp.weixin.qq.com/s/cdZcvFiAWhlYTaSrQGCPvA
    本帖最后由 XWCXF 于 2025-6-21 20:11 编辑

    并行任务处理学习
    今天开始学习编程中的并行任务处理,突然发现这和生活中的"一心多用"很像。就像边听音乐边打扫房间一样,程序也能同时执行多个任务。

    一、初识多线程
    学到了在aardio中用多线程实现并行任务的方法,感觉就像组建了一支工人团队。每个线程都是一个独立干活的"工人",可以同时处理不同任务。

    试着写了第一个多线程例子:

    [AAuto] 纯文本查看 复制代码
    import console;
    import thread.works;
    
    var works = thread.works( 10,
        function(id) {
            import console;
            for(i=1;10;1){
                thread.delay(100)
                console.log("任务" + id + "执行第" + i + "次")
            } 
        }
    );
    
    works.push(1);
    works.push(2);
    console.pause(true);


    这里用thread.works创建了任务管理器,最多能同时处理10个任务。往里面push了两个任务后,发现它们真的在同时执行!每个任务循环10次,中间用thread.delay(100)模拟执行时间,控制台里两个任务的输出交错出现,这就是并行的效果吧~

    二、线程同步:解决"抢锤子"的麻烦
    遇到了一个关键问题:当多个线程同时访问共享资源时会出乱子,就像多个工人抢一把锤子。这时候需要用"互斥锁"来协调。

    试着写了带锁的例子:

    [AAuto] 纯文本查看 复制代码
     import console;
      import thread.works;
      cycle = function(...){
          var works = thread.works( 10,
              function(id) {
                  import console;
                  thread.lock("写控制台")
                  for(i=1;10;1){
                      thread.delay(100)
                      console.log("任务" + id + "执行第" + i + "次")
                      thread.unlock("写控制台")
                  }
              }
          );
          return works.push(...);
      }
      thread.create(
          function( ... ){
              import win;         
    
          },
          cycle(1)
      );
    
      thread.delay(700)
      thread.create(
          function( ... ){
              import win;         
    
          },
          cycle(2)
      );
    
      thread.delay(2000);
      console.pause();


    这里用thread.lock("写控制台")加锁,thread.unlock("写控制台")解锁。确保同一时间只有一个线程能操作控制台。试运行时发现输出不再混乱,每个任务的日志都完整输出,锁的作用太重要了!

    三、线程池
    当任务很多时,频繁创建和销毁线程太浪费资源。这时候学到了线程池的概念,就像一个固定编制的工人团队,任务来了直接分配给空闲工人,不用反复招人解雇。

    试着用线程池写了例子:

    [AAuto] 纯文本查看 复制代码
    import console;
    import thread.manage
    
    //创建线程管理器
    manage = thread.manage(3)
    
    var task = function(id){
        import console;
        console.log("任务"+id+"开始执行");
        thread.delay(1000);
        console.log("任务"+id+"执行完成");
    }
    
    for(i=1;10;1){
        manage.create(task,i);
    }
    
    manage.waitClose()
    console.pause();

    这里创建了最多3个线程的线程池,然后提交10个任务。发现线程池会自动分配任务,3个线程轮流工作,不用自己管理线程的创建和销毁,代码简洁了很多。manage.waitClose()能等待所有任务完成。

    四、挑战
    用线程池并行执行5个任务,每个任务打印编号并模拟执行2秒。

    我的代码:

    [AAuto] 纯文本查看 复制代码
    import console;
    import thread.manage
    
    //创建线程管理器
    manage = thread.manage(3)
    
    var task = function(id){
        import console;
        console.log("任务"+id+"开始执行");
        thread.delay(2000);
        console.log("任务"+id+"执行完成");
    }
    
    for(i=1;5;1){
        manage.create(task,i);
    }
    
    manage.waitClose()
    console.pause();


    虽然线程池最多3个线程,但提交5个任务时,前3个先执行,完成后自动接手剩下的2个。看着控制台按顺序输出"任务开始-执行完成"的日志,感觉自己对并行处理的理解更深入了。明天得试试用多线程处理更复杂的任务,比如同时下载多个文件~



    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?立即注册

    ×
    非业余 - aardio 编程语言 - 非官方问答社区
    风行者三期培训:Aardio+Python+Flutter,1000集课程让你成为全栈开发高手!https://mp.weixin.qq.com/s/_WOoHFtITUyLk2k7BXYGkg
    Aardio培训大揭秘,轻松上手打造个人项目!https://mp.weixin.qq.com/s/cr47qhp_Cpz0p57lbbPwug
    aardio风行者第二期培训班https://mp.weixin.qq.com/s/uB6XHUDnGSk0JlWuiBE9AA
    aardio风行者第三期培训班https://mp.weixin.qq.com/s/cdZcvFiAWhlYTaSrQGCPvA
    回复

    使用道具 举报

    *滑块验证:
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    Archiver|手机版|小黑屋|非业余 - aardio 编程语言 - 非官方问答社区 知道创宇云防御

    GMT+8, 2025-6-27 21:52 , Processed in 0.138858 second(s), 29 queries .

    Powered by Discuz! X3.5

    © 2001-2025 Discuz! Team.

    快速回复 返回顶部 返回列表