免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3170 | 回复: 3
打印 上一主题 下一主题

Thread::Queue()中 dequeue多个元素时的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-05-18 16:04 |只看该作者 |倒序浏览
我开启一个线程(生产者)从文件中读取数据,并将内容enqueue()到队列中。

同时开始N个线程对线程队列中的数据进行任务处理,现在问题是我希望一次dequeue()多条记录,比如dequeue(100),但是在这种情况下,如果队列中的元素不足100个的话,就会造成阻塞,甚至在最后队列将要处理完毕只剩几个元素的时候,就会一直阻塞在那里了。但是又不能使用dequeue_nb(),因为有可能生产者还没有enqueue足够的数据进去。怎么样对这种情况进行更好的处理呢?

代码如下:
  1. #!/usr/bin/perl
  2. use strict;
  3. use threads 1.82;
  4. use threads::shared;
  5. use Thread::Queue;

  6. my $queue = Thread::Queue->new();
  7. $queue->enqueue(1..9999);

  8. my @threads = ();
  9. foreach (1,2,3,4,5) {
  10.     push @threads,threads->create("worker");
  11. }

  12. foreach (1,2,3,4,5) {
  13.     $queue->enqueue(undef);
  14. }

  15. while (1) {
  16.     foreach (@threads) {
  17.         my $num = threads->list();
  18.         print "threads total: $num\n";
  19.         if ($_->is_running()) {
  20.             sleep 1;
  21.             next;
  22.         }  

  23.         if ($_->is_joinable()) {
  24.             $_->join();
  25.         }  
  26.    
  27.         sleep 1;
  28.     }  
  29. }


  30. sub worker {
  31.     while (my @DataElement = $queue->dequeue(100)) {
  32.         my $tid = threads->tid();
  33.         print "Threads ID:$tid\t@DataElement\n";
  34.     }
  35. }
复制代码

论坛徽章:
0
2 [报告]
发表于 2012-05-18 16:47 |只看该作者
这段是做什么用的?
foreach (1,2,3,4,5) {
    $queue->enqueue(undef);
}

论坛徽章:
0
3 [报告]
发表于 2012-05-18 17:26 |只看该作者
回复 2# royalzhang


    刚开始我是每次dequeue()一个元素的。你提到的那段,作用是结束工作线程,因为工作线程每次dequeue()一个元素,遇到undef就退出while循环并结束整个线程的工作了。

    现在我每次dequeue(100),你提到的那段就没什么用处了。

论坛徽章:
0
4 [报告]
发表于 2012-05-18 17:51 |只看该作者
回复 3# scutdk


   哦,是的。当每次dequeue一个的时候工作的很好,dequeue多个的时候不行。不知道此模块内部是怎么判断的。填进去多个undef也不行。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP