Perl 程序在做多线程时async使用一定要谨慎
????? 使用Perl开发Linux和Unix维护管理脚本是常用的手段,其中也会因为作业要求大量使用多线程技术。通常下我们使用threads::create()创建一个新的线程,这时候往往我们会创建一个$thr来保存线程ID,并在程序结束后由threads回收线程资源。但是threads还提供了一个叫做async的函数,这个函数提供程序块(BLOCK)的方式创建匿名线程。这个函数帮助我们解决多线程中的同步问题。例如我们在多线程中使用print方法时会发现,我们的print结果没有及时的回显到屏幕上,那么这个函数将帮我解决这个问题。 ? ????? 但是在使用async函数时一定要小心,那就是函数并不会在BLOCK块执行完成后释放匿名线程资源,这将会直接导致内存溢出的严重后果。 当async函数导致内存溢出后,无法再创建新的匿名线程时,会出现这样的错误警告: Thread creation failed: pthread_create returned 12 at /usr/lib/perl5/5.8.8/i386-linux-thread-multi/threads.pm line 117. 并且我们使用ps 命令可以看到(红色字体描述的是内存使用量): root????? 9332? 1.0 87.0 3129776 222236 ?????? Ssl? 18:18?? 0:11 这样的信息。 我们应该在代码中使用$thr变量来保存这个匿名线程对象,并在使用完成后手动结束和释放掉该线程资源。或在BLOCK代码块的}后使用->exit()来让该线程自己结束掉,这时perl才会去释放async匿名线程的资源。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |