- 论坛徽章:
- 0
|
我开启一个线程(生产者)从文件中读取数据,并将内容enqueue()到队列中。
同时开始N个线程对线程队列中的数据进行任务处理,现在问题是我希望一次dequeue()多条记录,比如dequeue(100),但是在这种情况下,如果队列中的元素不足100个的话,就会造成阻塞,甚至在最后队列将要处理完毕只剩几个元素的时候,就会一直阻塞在那里了。但是又不能使用dequeue_nb(),因为有可能生产者还没有enqueue足够的数据进去。怎么样对这种情况进行更好的处理呢?
代码如下:- #!/usr/bin/perl
- use strict;
- use threads 1.82;
- use threads::shared;
- use Thread::Queue;
- my $queue = Thread::Queue->new();
- $queue->enqueue(1..9999);
- my @threads = ();
- foreach (1,2,3,4,5) {
- push @threads,threads->create("worker");
- }
- foreach (1,2,3,4,5) {
- $queue->enqueue(undef);
- }
- while (1) {
- foreach (@threads) {
- my $num = threads->list();
- print "threads total: $num\n";
- if ($_->is_running()) {
- sleep 1;
- next;
- }
- if ($_->is_joinable()) {
- $_->join();
- }
-
- sleep 1;
- }
- }
- sub worker {
- while (my @DataElement = $queue->dequeue(100)) {
- my $tid = threads->tid();
- print "Threads ID:$tid\t@DataElement\n";
- }
- }
复制代码 |
|