When a room is created, it should start listening for messages. That's why
it starts listening in the init, though there is no actual
processing. Removing the consumer causes the queue to be deleted, so I don't
think that's necessary.

Here's my current attempt: http://dpaste.com/207704/

What I'm going for here -- not achieved yet -- is to have the same # of
objects at the 1st and 3rd call to gc.get_objects. My question is how to get
there. If you look at the unload method, that's my current attempt to
cleanup, but clearly it's either wrong or there's no right way to do
it. First time using each of AMQP, Twisted, and the gc module, so please
tell me what I'm doing wrong. Also, the number of extra objects (3rd call -
1st call) increases linearly with the argument to range() controlling how
many rooms are created, so I know it's something relating to room cleanup.

On Mon, Jun 14, 2010 at 7:56 PM, Dave Peticolas <d...@krondo.com> wrote:

> On 06/14/2010 05:31 PM, Andrew Badr wrote:
>
>> Sorry if you get this message twice; launchpad sucks.
>>
>> I have a long-running server processes that listen for new messages from
>> some changing set of rooms. I want to make sure that when I'm done with a
>> particular room, all the resources associated with it are eventually freed.
>> Here's what my Room init code does:
>>
>>    @inlineCallbacks
>>    def startListening(self):
>>        routing_key = 'rooms.' + self.id <http://self.id>
>>
>>        queue_name = routing_key + '::' + CYCLONE_ID
>>        AMQP_CHANNEL.queue_declare(queue=queue_name, durable=False,
>> auto_delete=True)
>>        AMQP_CHANNEL.exchange_declare(exchange=EXCHANGE_NAME, type='topic',
>> durable=True)
>>        AMQP_CHANNEL.queue_bind(
>>                queue=queue_name,
>>                exchange=EXCHANGE_NAME,
>>                routing_key=routing_key)
>>        consumer_tag = 'room' + self.id <http://self.id>
>>
>>        AMQP_CHANNEL.basic_consume(queue=queue_name,
>> consumer_tag=consumer_tag)
>>        queue = yield AMQP_CONNECTION.queue(consumer_tag)
>>        while True:
>>            msg = yield queue.get()
>>            self.tell_msg(msg)
>>
>> Note that the AMQP connection+channel are global. When the server wants to
>> forgot about a room, what do I have to do to ensure that all resources will
>> eventually be garbage collected? Does it suffice to cancel the consumer? Do
>> I have to close the TimeoutDeferredQueue? Looking at the code in
>> protocol.py, it looks like there might be no way to make the channel forget
>> about the queue. Am I reading that correctly? If so, that means I would need
>> a new channel for each room, right?
>>
>>
> That's not just init code, right? I mean you're also processing messages.
>
> Anyway, I think you want to call queue_delete like this (untested):
>
> AMQP_CHANNEL.queue_delete(queue=queue_name)
>
> dave
>
>
> _______________________________________________
> Mailing list: https://launchpad.net/~txamqp-user
> Post to     : txamqp-user@lists.launchpad.net
> Unsubscribe : https://launchpad.net/~txamqp-user
> More help   : https://help.launchpad.net/ListHelp
>
_______________________________________________
Mailing list: https://launchpad.net/~txamqp-user
Post to     : txamqp-user@lists.launchpad.net
Unsubscribe : https://launchpad.net/~txamqp-user
More help   : https://help.launchpad.net/ListHelp

Reply via email to