32👍
What you want is a thread. They’re very easy to use. You just subclass threading.Thread
and write a run
method:
import threading
class LikeThread(threading.Thread):
def __init__(self, user, liked, **kwargs):
self.user = user
self.liked = liked
super(LikeThread, self).__init__(**kwargs)
def run(self):
# long running code here
Then, when your ready to do the task, you fire it off with:
LikeThread(request.user, something).start()
The rest of your view code or whatever will resume and return the response, and the thread will happily do its work until it’s done and then end itself.
See full documentation: http://docs.python.org/library/threading.html
54👍
Also look into celery (or more specifically django-celery). It is an async task scheduler / handler. So your post_save signal handler creates a task, which is picked up and executed through celery. That way you still have your speedy application, while the heavy lifting is performed async, even on a different machine or batch of machines.
- [Django]-Missing Table When Running Django Unittest with Sqlite3
- [Django]-How to send a correct authorization header for basic authentication
- [Django]-Class views in Django
8👍
Hm, first of all signals in Django are not asynchronous. For your particular case I think post_save
is the wrong way to go. The most straightforward way is simply to fire an ajax request to view which do your like action and don’t wait for the response. Instead modify your view/html directly after you fired the request.
That would of course require that you know beforehand that your user is allowed to like this item and that your request will not fail.
- [Django]-How do I return a 401 Unauthorized in Django?
- [Django]-Get path of virtual environment in pipenv
- [Django]-Django returning HTTP 301?
4👍
The async-signals
package (https://github.com/nyergler/async-signals) abstracts this issue. You call an async signal function; if Celery is present the package uses it to issue the signal asynchronously from a worker; and if Celery is not available the package sends the signal in the traditional synchronous way.
- [Django]-How to access a dictionary element in a Django template?
- [Django]-How to force Django models to be released from memory
- [Django]-Django development server reload takes too long