- 論壇徽章:
- 0
|
我開啟一個線程(生產(chǎn)者)從文件中讀取數(shù)據(jù),并將內(nèi)容enqueue()到隊列中。
同時開始N個線程對線程隊列中的數(shù)據(jù)進行任務處理,現(xiàn)在問題是我希望一次dequeue()多條記錄,比如dequeue(100),但是在這種情況下,如果隊列中的元素不足100個的話,就會造成阻塞,甚至在最后隊列將要處理完畢只剩幾個元素的時候,就會一直阻塞在那里了。但是又不能使用dequeue_nb(),因為有可能生產(chǎn)者還沒有enqueue足夠的數(shù)據(jù)進去。怎么樣對這種情況進行更好的處理呢?
代碼如下:- #!/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";
- }
- }
復制代碼 |
|