免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: Perl_Er
打印 上一主题 下一主题

关于perl的多线程&多进程的问题 [复制链接]

论坛徽章:
0
41 [报告]
发表于 2009-07-01 21:31 |只看该作者

回复 #39 MMMIX 的帖子

但是加锁的话要等待这个&prt完了才可以做下一个,那就失去了多线程的意义啦. 还是相当于一个一个执行
  1. sub prt(){
  2.     lock($thread_count);
  3.     $thread_count++;
  4.     print "the thread is $_[0]\n";
  5.     sleep 5;
  6. #    print "the count is :$thread_count","\n";
  7.     $thread_count--;
  8. }
复制代码

[ 本帖最后由 Perl_Er 于 2009-7-1 21:33 编辑 ]

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
42 [报告]
发表于 2009-07-01 21:36 |只看该作者
原帖由 Perl_Er 于 2009-7-1 21:31 发表
但是加锁的话要等待这个&prt完了才可以做下一个,那就失去了多线程的意义啦. 还是相当于一个一个执行

你难道没有看到我上面的例子么?在线程函数中,只需要在退出的时候才需要对 $thread_num 加锁并将其减一。

论坛徽章:
0
43 [报告]
发表于 2009-07-01 21:37 |只看该作者

回复 #39 MMMIX 的帖子

有时候是100个,有时候是101,100个左右是吗?

[ 本帖最后由 Perl_Er 于 2009-7-1 21:38 编辑 ]

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
44 [报告]
发表于 2009-07-01 21:39 |只看该作者
原帖由 Perl_Er 于 2009-7-1 21:37 发表
有时候是100个,有时候是101,100个左右是吗?

还有 99 个,98 个,等等。

论坛徽章:
0
45 [报告]
发表于 2009-07-01 21:48 |只看该作者

回复 #44 MMMIX 的帖子

我在你那个上面加了一个sleep 2,每起个新的进程要等2秒,
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. use threads;
  5. use threads::shared;

  6. my $thread_num :shared = 0;

  7. sub start_thread {
  8.         print "Thread ", threads->tid(), " started, current thread numbers $_[0]\n";
  9.         {
  10.                 lock($thread_num);
  11.                 $thread_num--;
  12.                 sleep 2;
  13.                 cond_signal($thread_num);
  14.         }
  15. }

  16. for (1 .. 200) {
  17.         {
  18.                 lock($thread_num);
  19.                 cond_wait($thread_num) until $thread_num < 10;

  20.                 my $t = threads->create(\&start_thread, $thread_num + 1);
  21.                 $t->detach();
  22.                
  23.                 $thread_num++;
  24.         }
  25. }
复制代码

[ 本帖最后由 Perl_Er 于 2009-7-1 21:49 编辑 ]

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
46 [报告]
发表于 2009-07-01 23:32 |只看该作者
原帖由 Perl_Er 于 2009-7-1 21:48 发表
我在你那个上面加了一个sleep 2,每起个新的进程要等2秒,

干嘛要这么做?

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
47 [报告]
发表于 2009-07-01 23:33 |只看该作者

回复 #35 MMMIX 的帖子

更简洁的例子,使用 Thread::Semaphore

  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. use threads;
  5. use Thread::Semaphore;

  6. my $thread_num = Thread::Semaphore->new(10);

  7. sub start_thread {
  8.         print "Thread ", threads->tid(), " started\n";
  9.         $thread_num->up();
  10. }

  11. for (1 .. 200) {
  12.         $thread_num->down();
  13.         if (my $t = threads->create(\&start_thread)) {
  14.                 $t->detach();
  15.         }
  16. }
复制代码


同样,这个也不能保证一定会创建 200 个线程,很奇怪。

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
48 [报告]
发表于 2009-07-01 23:50 |只看该作者
原帖由 MMMIX 于 2009-7-1 23:33 发表
更简洁的例子,使用 Thread::Semaphore

同样,这个也不能保证一定会创建 200 个线程,很奇怪。

在脚本的最后加上 sleep(2); 后,每次都能看到 200 个输出。看来是由于主线程提前结束,某些线程还没来得及打印信息就被结束掉了。使用 threads::shared 的实现也是类似的问题。

论坛徽章:
0
49 [报告]
发表于 2009-07-02 00:16 |只看该作者
写了个多进程的  
xp 下开50个进程  timeout为5  局域网内ping 254个地址 用时 28秒左右


  1. #!perl
  2. use strict;
  3. use warnings;
  4. use Smart::Comments;

  5. use Net::Ping::External qw(ping);
  6. use Parallel::ForkManager;

  7. my $MAX = 50;
  8. my $pm = new Parallel::ForkManager($MAX);

  9. my @hosts = map{"192.168.1.$_"}(1..254);

  10. ### [<now>] start

  11. foreach (@hosts) { ### Working [ % ] done
  12.         $pm->start and next;
  13.         my $alive = ping(hostname => $_, timeout => 5);
  14.         print "$_ is alive!\n" if $alive;
  15.         $pm->finish;
  16. }

  17. ### [<now>] end
复制代码


btw:如果perl不能满足,可以考虑改用erlang试试  随随便便一台机器就可以开几万个进程

[ 本帖最后由 hitsubunnu 于 2009-7-2 00:21 编辑 ]

论坛徽章:
0
50 [报告]
发表于 2009-07-02 07:41 |只看该作者

回复 #49 hitsubunnu 的帖子

我在production环境中,所以只能用标准模块。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP