Multithreading for Python Django

前端 未结 4 1172
情深已故
情深已故 2020-12-12 14:53

Some functions should run asynchronously on the web server. Sending emails or data post-processing are typical use cases.

What is the best (or most pythonic) way wri

4条回答
  •  长情又很酷
    2020-12-12 15:45

    tomcounsell's approach works well if there are not too many incoming jobs. If many long-lasting jobs are run in short period of time, therefore spawning a lot of threads, the main process will suffer. In this case, you can use a thread pool with a coroutine,

    # in my_utils.py
    
    from concurrent.futures import ThreadPoolExecutor
    
    MAX_THREADS = 10
    
    
    def run_thread_pool():
        """
        Note that this is not a normal function, but a coroutine.
        All jobs are enqueued first before executed and there can be
        no more than 10 threads that run at any time point.
        """
        with ThreadPoolExecutor(max_workers=MAX_THREADS) as executor:
            while True:
                func, args, kwargs = yield
                executor.submit(func, *args, **kwargs)
    
    
    pool_wrapper = run_thread_pool()
    
    # Advance the coroutine to the first yield (priming)
    next(pool_wrapper)
    
    from my_utils import pool_wrapper
    
    def job(*args, **kwargs):
        # do something
    
    def handle(request):
        # make args and kwargs
        pool_wrapper.send((job, args, kwargs))
        # return a response
    

提交回复
热议问题