Thank you very much for clarifying - I wasn't exactly sure how to approach 
this, but your response makes sense.

Cheers!

On Saturday, May 13, 2017 at 6:09:14 PM UTC-7, Andrew Godwin wrote:
>
> Hi Tristan,
>
> All messages sent from a consumer are delayed for sending until the 
> consumer exits to keep things atomic - long-running consumers is bad for 
> performance, as they'll hog an entire thread (they run synchronously) and 
> so you'll quickly run out of threads/processes as you'll end up using one 
> per connection.
>
> Instead, you should do your task and exit out of the consumer as quickly 
> as possible to free the worker space for something else to run. To achieve 
> repeated execution with delays, you can either look at the delay server (
> http://channels.readthedocs.io/en/stable/delay.html) or write your own 
> consumer code that talks to channels that uses an asynchronous framework 
> (asyncio, twisted)
>
> Andrew
>
> On Sat, May 13, 2017 at 11:29 AM, Tristan Barry <[email protected] 
> <javascript:>> wrote:
>
>> Hi - I'm working with Django Channels (1.1.3) on a Django project and I 
>> have some questions about how to send multiple messages from the same 
>> consumer.
>>
>> The idea is the consumer will receive a request to do some work, and will 
>> send incremental results back to user. I've attached a simplified example 
>> below with some questions. I'm hoping someone can steer me in the right 
>> direction.
>>  
>>
>> Django Channels:
>>
>>>
>>> def do_some_work(message):
>>>     for i in range(3):
>>>         time.sleep(2)
>>>         message.reply_channel.send({"text": 'Finished work ' + str(i)})
>>>
>>> def ws_connect(message):
>>>     message.reply_channel.send({"accept": True})
>>>
>>> channel_routing = [
>>>     route('websocket.connect', ws_connect),
>>>     route('websocket.receive', do_some_work, path=r'/todo')
>>> ]
>>
>>
>> Javascript (borrowed mostly from the docs):
>>
>> socket = new WebSocket("ws://" + window.location.host + "/todo/");
>>> socket.onmessage = function(e) {
>>>     console.log(e.data);
>>> }
>>> socket.onopen = function() {
>>>     socket.send("hello world");
>>> }
>>> // Call onopen directly if socket is already open
>>> if (socket.readyState == WebSocket.OPEN) socket.onopen();
>>
>>
>>
>> Expected results: Every two seconds the browser would receive a reply 
>> from the consumer saying 'Finished work x'. 
>>
>> What I observe is a delay for ~6 seconds and then all results returned at 
>> the same time. Are the response on the reply channel blocked somehow? Is 
>> there I way I can yield, or release the message before doing the next 
>> increment of work?
>>
>> I've also tried setting up a new consumer that *only* replies via a 
>> Group. So instead of *message.reply_channel.send, *I would 
>> *Channel('reply-channel').send({results: 
>> ...})* and have a new consumer defined on channel_routing for the 
>> *'reply-channel'*. But the results are the same - all the 'work' is 
>> completed before the browser receives a response. 
>>
>> Any hints on how to send multiple message in the same consumer?
>>
>> Thanks in advance.
>>
>> -- 
>> You received this message because you are subscribed to the Google Groups 
>> "Django users" group.
>> To unsubscribe from this group and stop receiving emails from it, send an 
>> email to [email protected] <javascript:>.
>> To post to this group, send email to [email protected] 
>> <javascript:>.
>> Visit this group at https://groups.google.com/group/django-users.
>> To view this discussion on the web visit 
>> https://groups.google.com/d/msgid/django-users/4bf7d2ce-9a13-4f85-9933-cb8496e1f59d%40googlegroups.com
>>  
>> <https://groups.google.com/d/msgid/django-users/4bf7d2ce-9a13-4f85-9933-cb8496e1f59d%40googlegroups.com?utm_medium=email&utm_source=footer>
>> .
>> For more options, visit https://groups.google.com/d/optout.
>>
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/django-users.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-users/ff7db442-5444-4ff2-ae27-3abd18695b94%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to