- 论坛徽章:
- 0
|
本帖最后由 scutdk 于 2012-05-17 00:18 编辑
- #!/usr/bin/perl
- use strict;
- use threads;
- use threads::shared;
- use Thread::Queue;
- my $queue = Thread::Queue->new();
- my @threads = ();
- foreach (1,2,3,4,5) {
- push @threads,threads->create("worker");
- }
- $queue->enqueue(1..9999);
- 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 test {
- my $rand = int(rand(10));
- $rand += 5;
- sleep $rand;
- }
- sub worker {
- while (my @DataElement = $queue->dequeue(100)) {
- my $tid = threads->tid();
- print "Threads ID:$tid\t@DataElement\n";
- }
- }
复制代码 同样一段代码,在不同版本的模块下得到不同结果:
某机器配置如下:
threads : 1.82
Thread::Queue : 2.11
运行结果是我想要的。形如Threads ID:5 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
另一台机器:
threads : 1.86
Thread::Queue : 2.00
每次我虽然dequeue(100),但是返回的却只有1个元素,怎么回事儿呢?
Threads ID:1 1
Threads ID:1 2
Threads ID:1 3
Threads ID:1 4
Threads ID:1 5
Threads ID:1 6
Threads ID:1 7
Threads ID:1 8
Threads ID:1 9
Threads ID:1 10
Threads ID:1 11
Threads ID:1 12 |
|