CNode

使用事件订阅/发布模拟简单的生产者/消费者模型遇到的问题

问答
Kkylind发布于11 年前最后回复11 年前10 回复5862 浏览0 收藏

我想实现的功能是生产者生产一批数据后, 触发full事件。 消费者开始消费数据, 消费之后,触发empty事件, 生产者开始生产数据......

下面的代码执行的结果是生产者生产了数据之后,消费者消费了数据, 但不能触发生产者再造数据了。 因为我侦错到Empty的生产者监听器数量为0. 这是为什么? 1.index文件

var event_pattern = require('./event_pattern');
var readline = require('readline');
var util = require('util');

//实例化一个生产者和两个消费者
var producer = new event_pattern.Producer();

var consumer1 = new event_pattern.Consumer('A');
var consumer2 = new event_pattern.Consumer('B');
//消费者订阅生产者full事件
producer.on('full', consumer1.consume);
producer.on('full', consumer2.consume);
//生产者订阅消费者empty事件
consumer1.on('empty', producer.produce);
consumer2.on('empty', producer.produce);

producer.produce();

2.生产者与消费者模块

var events = require('events');
var console = require('console');
var util = require('util');

function Producer() {

    events.EventEmitter.call(this);

    var totalCount = totalCount || 100;

    var currentCount=0;

    this.produce = function(beans) {

        if (!util.isArray(beans)) {
            beans = [];
        }

        var i = 0;
        var bean;

        while (i < 18 && currentCount++ < totalCount) {

            bean = Math.round(Math.random() * 100);

            beans.push(bean);

            console.log("produce: " + bean);

            i++;

        }

        console.log("full listeners: " + this.listenerCount('full'));
        this.emit('full', beans, this);

    };

};

util.inherits(Producer, events.EventEmitter);

function Consumer(name) {

    events.EventEmitter.call(this);

    this.name = name;

    this.consume = function(beans) {

        var i = 0;

        while (i < 10 && beans.length > 0) {
            var bean = beans.shift();
            console.log(name + "consume: " + bean);
            i++;
        }

        if (beans.length == 0) {
             console.log("empty listeners: " + this.listenerCount('empty'));//值为0,为什么没有任何监听器了?????
            var hasListeners = this.emit('empty', beans);
        }

    };

}

Consumer.prototype=new events.EventEmitter();
Consumer.prototype.constructor=Consumer;
查看回复

回复 (10)

K
kylind#1·11 年前

自己顶,有帮忙解答一下这个的问题的吗? 这个问题困扰我两天了

X
XGHeaven#2·11 年前

只能这么说,如果想要继承EventEmitter,最好这么用

function Consumer(){
	EventEmitter.call(this);
	// others
}

其他的我也看不下去

K
kylind#3·11 年前

事实上,我正是这么写呢1

Y
yakczh#4·11 年前

如果用两个nodejs进程,一个生产,一个消费, 之间用send/on('message',callback) 来通信呢

R
reverland#5·11 年前

我不是很明白哈,是

this.consume

还是想

Producer.prototype.consume

K
kylind#6·11 年前
K
kylind#7·11 年前
引用 yakczh如果用两个nodejs进程,一个生产,一个消费, 之间用send/on('message',callback) 来通信呢

@yakczh 我只是想知道问题出在哪里? 如果把生产者和消费者写到一个类里面就可以正常工作。 分成两个类就不工作了?

R
reverland#8·11 年前
引用 kylind@reverland 我试过了不是这里的问题

@kylind 我是想说好歹检查下this。。。

K
kylind#9·11 年前
引用 reverland@kylind 我是想说好歹检查下this。。。

@reverland 对的,我昨天找到了原因。 在对象初化的时候要添加对this的引用。 因为生产者与消费都方法都是被当作事件handler来传递。 等到调用的时候this已经变化了

参与回复
登录后即可参与回复。登录