Thanks for the reply. Should I still use async code inside that worker process ? While developing I simply do a run_server on the command line -- then I would always have to do a run_worker in addition -- right ?
-Sebastian On Mon, Jul 16, 2018 at 7:05 PM, Andrew Godwin <[email protected]> wrote: > You are correct in that you could store the model instance on "self" but > this would result in caching issues, as that instance would not be updated > after the initial socket connection. > > If you want to run "background routines", I would discourage you from > doing these as random orphaned tasks launched from web processes - there's > no provision in the server to track that task and clean up after it. > Instead, I'd recommend running those kinds of tasks in a separate process. > > Andrew > > On Sun, Jul 15, 2018 at 2:03 AM Sebastian Haase <[email protected]> > wrote: > >> Hi, >> I'm still in the process of migration from channels 1 to channels 2... >> >> One thing I'm interested in is related to [ http://channels.readthedocs. >> io/en/latest/one-to-two.html#application-instances ] >> """ASGI applications are now instantiated once per socket and can use >> local variables on self to store information""" >> >> So, we have an `AsyncJsonWebsocketConsumer` where websocket clients want >> to operate on a django model instance - each websocket mostly on the same >> object. >> With channels 1 we would always send with each message the `objID` - >> doing `obj=model.objects.get(pk=objID)` and read/write on `obj`. >> In channels 2 I could save the `objID` server side in the consumer class >> - like `self.objID` with one initial message like `set-obj-id`. >> For the ORM access I now have to do `obj = await database_sync_to_async( >> model.objects.get )(pk=self.objID)` >> >> QUESTION: Is is legitimate to store the "model instance itself" like >> `self.obj = await database_sync_to_async( model.objects.get )(pk=objID)` >> and keep that instance around for the lifetime of that socket -- doing some >> `await database_sync_to_async( self.obj.save )()` on some respective >> messages ? >> Note: multiple websockets might operate on the same obj/objID ! So my >> feeling is that would work as long as I keep testing with the `runserver` >> or in production as long as I know that I have only ONE PROCESS -- but in >> general the django caching mechanism might cause inconsistencies ... !? >> >> >> Another, somewhat related question is regarding a kind of "background >> routine" that I started to implement as an asyncio Task. >> Note: It was kind of tricky to realize that I needed >> `asyncio.ensure_future` to get it run asynchronously -- ref. >> https://stackoverflow.com/questions/48871831/django- >> channels-async-consumer-does-not-appear-to-execute-asynchronously >> Maybe that could be worked into the channels docs maybe here: >> http://channels.readthedocs.io/en/latest/topics/worker.html >> Since that "routine" should be able to be canceled and pauses (I'm using >> an asyncio.event) from any websocket consumer: >> QUESTION: What is the best place to store that Task object ? Again with >> `runserver` I can just use a global module-level `dict` to keep those Task >> objects. >> >> The whole async experience is really twisting my mind and interesting at >> the same time ;-) >> Regards, >> Sebastian >> >> -- 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/CAN06oV-ySRN%3D-9BEKd8SfvgB52F3QagNMh_rZqQQ6wCS3HFEkg%40mail.gmail.com. For more options, visit https://groups.google.com/d/optout.

