A lightweight task queue does not have powerful functions and related brokers. It focuses on lightweight tasks, and the code reading is also relatively simple.
 
 
 About huey: (lighter than celery, better than mrq and rq !)
 
 A lightweight alternative.
 
 Written in python
 
 No deps outside stdlib, doesn't redis (or roll your own backend)
 
 Support for django
 
 Supports:
 
 Multi-threaded task execution
 
 Scheduled execution at a given time
 
 Periodic execution, like a crontab
 
 Retrying tasks that fail
 
 Task result storage
 
 
 Installation: 
 
 
  
   
   |  The code is as follows:  |  
     |  
  
 
   
    Installing  Huey can be installed very easily using pip.     Pip install huey  Huey has no dependencies outside the standard library, but currently the only fully-implemented queue backend it ships with requires redis. To use the redis backend, you will need to install the python client.     Pip install redis  Using git  If you want to run the very latest, feel free to pull down the repo from github and install by hand.     Git clone https://github.com/coleifer/huey.git  Cd huey  Python setup. py install  You can run the tests using the test-runner:     Python setup. py test  |  
  
 
  
 
 
 
 
 For more information about huey APIs, see the following sections. 
 
 
  
   
   |  The code is as follows:  |  
       |  
  
 
   
    From huey import RedisHuey, crontab     Huey = RedisHuey ('My-app', host = 'redis .myapp.com ')     @ Huey. task ()  Def add_numbers (a, B ):  Return a + B     @ Huey. periodic_task (crontab (minute = '0', hour = '3 '))  Def nightly_backup ():  Sync_all_data ()  |  
  
 
  
 
 
 
 
 Some cli parameters when juey is used as a woker.
 
 
 Commonly used:
 
 -L execution of log files.
 
 -The number of wworkers, the value of-w is too large, and it must increase the processing capability of the task.
 
 -P -- periodic: When the huey worker is started, he will find the task for crontab from tasks. py, and will send several threads to handle these tasks.
 
 -N does not start the pre-cycle execution in crontab. Only when you trigger the execution will the tasks of the cycle week be executed.
 
 -- Threads means you understand.
 1 
 
 
  
   
   |  The code is as follows:  |  
       |  
  
 
   
    # Original:  The following table lists the options available for the consumer as well as their default values.     -L, -- logfile  Path to file used for logging. when a file is specified, by default Huey will use a rotating file handler (1 MB/chunk) with a maximum of 3 backups. you can attach your own handler (huey. logger) as well. the default loglevel is INFO.  -V, -- verbose  Verbose logging (equates to DEBUG level). If no logfile is specified and verbose is set, then the consumer will log to the console. This is very useful for testing/debugging.  -Q, -- quiet  Only log errors. The default loglevel for the consumer is INFO.  -W, -- workers  Number of worker threads, the default is 1 thread but for applications that have threads I/O bound tasks, increasing this number may lead to greater throughput.  -P, -- periodic  Indicate that this consumer process shocould start a thread dedicated to enqueueing "periodic" tasks (crontab-like functionality). This defaults to True, so shocould not need to be specified in practice.  -N, -- no-periodic  Indicate that this consumer process shocould not enqueue periodic tasks.  -D, -- delay  When using a "polling"-type queue backend, the amount of time to wait between polling the backend. Default is 0.1 seconds.  -M, -- max-delay  The maximum amount of time to wait between polling, if using weighted backoff. Default is 10 seconds.  -B, -- backoff  The amount to back-off when polling for results. Must be greater than one. Default is 1.15.  -U, -- utc  Indicates that the consumer shocould use UTC time for all tasks, crontabs and scheduling. Default is True, so in practice you shoshould not need to specify this option.  -- Localtime  Indicates that the consumer shocould use localtime for all tasks, crontabs and scheduling. Default is False.  Examples     Running the consumer with 8 threads, a logfile for errors only, and a very short polling interval:     Huey_consumer.py my. app. huey-l/var/log/app. huey. log-w 8-B 1.1-m 1.0  |  
  
 
  
 
 
 
 
 
 Task queue huey uses redis to store queue tasks. Therefore, we need to install redis-server and redis-py in advance. The installation method will not be mentioned. Search for it by yourself.
 
 
 First, create the linked instance of the huey: 
 
 
  
   
   |  The code is as follows:  |  
       |  
  
 
   
    # Config. py  From huey import Huey  From huey. backends. redis_backend import RedisBlockingQueue     Queue = RedisBlockingQueue ('test-queue ', host = 'localhost', port = 6379)  Huey = Huey (queue)  |  
  
 
  
 
 
 Then there is the task, that is, who you want to bring to the task queue circle, which is represented by tasks. py like celey, rq, and mrq. 
 
 
  
   
   |  The code is as follows:  |  
     |  
  
 
   
    From config import huey # import the huey we instantiated in config. py        @ Huey. task ()  Def count_beans (num ):  Print '-- counted % s beans --' % num  |  
  
 
  
 
 
 
 
 Another one is actually executed. Main. py is equivalent to the producer, and tasks. py is equivalent to the consumer relationship. Main. py is responsible for feeding data. 
 
 
  
   
   |  The code is as follows:  |  
       |  
  
 
   
    Main. py  From config import huey # import our "huey" object  From tasks import count_beans # import our task        If _ name _ = '_ main __':  Beans = raw_input ('How many beans? ')  Count_beans (int (beans ))  Print 'enqueued job to count % s beans '% beans      Ensure you have Redis running locally    Ensure you have installed huey    Start the consumer: huey_consumer.py main. huey (notice this is "main. huey" and not "config. huey ").    Run the main program: python main. py  |  
  
 
  
 
 
 
 
 Like celery and rq, the result is obtained in your config. in the py or main code, specify the storage method. Currently, huey only supports redis, but it is enough for its features and size!
 
 
 Just a few words. Import the RedisDataStore database and declare the storage address. 
 
 
  
   
   |  The code is as follows:  |  
       |  
  
 
   
    From huey import Huey  From huey. backends. redis_backend import RedisBlockingQueue  From huey. backends. redis_backend import RedisDataStore # ADD THIS LINE        Queue = RedisBlockingQueue ('test-queue ', host = 'localhost', port = 6379)  Result_store = RedisDataStore ('result', host = 'localhost', port = 6379) # ADDED     Huey = Huey (queue, result_store = result_store) # ADDED result store  |  
  
 
  
 
 
 
 
 At this time, when we try ipython again, we will find that we can get tasks. the return value in py is actually in main. when it is obtained in py, it is still obtained from redis through uuid. 
 
 
  
   
   |  The code is as follows:  |  
       |  
  
 
   
    >>> From main import count_beans  >>> Res = count_beans (100)  >>> Res # what is "res "?  <Huey. api. AsyncData object at 0xb7471a4c>  >>> Res. get () # get the result of this task  'Counted 100 beans'  |  
  
 
  
 
 
 
 
 Huey also supports delayed execution of celey and crontab. These functions are very important. You can customize the priority or no longer need to use linux crontab.
 
 
 The usage is very simple. Just add another delay time. After reading the source code of huey, it will be executed immediately by default. Of course, it depends on whether your thread is in the state to be executed. 
 
 
  
   
   |  The code is as follows:  |  
       |  
  
 
   
    >>> Import datetime  >>> Res = count_beans.schedule (args = (100,), delay = 60)  >>> Res  <Huey. api. AsyncData object at 0xb72915ec>  >>> Res. get () # this returns None, no data is ready  >>> Res. get () # still no data...  >>> Res. get (blocking = True) # OK, let's just block until its ready  'Counted 100 beans'  |  
  
 
  
 
 
 
 
 
 Another retry introduction, huey also has retry, which is very practical. If you see the introduction of the celery retry mechanism in my previous article, you can also understand what huey is. Yes, he actually made a decorator in front of the specific function in tasks. There is a func try exception retry logic in the decorator. Everyone knows. 
 
 
  
   
   |  The code is as follows:  |  
       |  
  
 
   
    # Tasks. py  From datetime import datetime     From config import huey     @ Huey. task (retries = 3, retry_delay = 10)  Def try_thrice ():  Print 'trying... % s' % datetime. now ()  Raise Exception ('nope ')   |  
  
 
  
 
 
 
 
 
 Huey is a chance for you to repent ~ That is to say, if you want to cancel another scheduled task of deley, you can simply revoke it. 
 
 
  
   
   |  The code is as follows:  |  
       |  
  
 
   
    # Count some beans  Res = count_beans (10000000)     Res. revoke ()  The same applies to tasks that are scheduled in the future:     Res = count_beans.schedule (args = (100000,), eta = in_the_future)  Res. revoke ()     @ Huey. task (crontab (minute = '*'))  Def print_time ():  Print datetime. now ()   |  
  
 
  
 
 
 Task ()-transparent decorators make your functions more elegant.
 
 Periodic_task ()-this is a periodic task.
 
 Crontab ()-periodic task with crontab when the worker is started.
 
 BaseQueue-task queue
 
 BaseDataStore-after the task is executed, you can insert the result. BAseDataStore can be rewritten by yourself. 
 
   
 
 
 The official git library of huey provides the relevant test code:
 
 
 Main. py 
 
 
  
   
   |  The code is as follows:  |  
       |  
  
 
   
    From config import huey  From tasks import count_beans        If _ name _ = '_ main __':  Beans = raw_input ('How many beans? ')  Count_beans (int (beans ))  Print ('enqueued job to count % s beans '% beans)  |  
  
 
  
 
 
 
 
 Tasks. py 
 
 
  
   
   |  The code is as follows:  |  
       |  
  
 
   
    Import random  Import time  From huey import crontab     From config import huey        @ Huey. task ()  Def count_beans (num ):  Print "start ..."  Print ('-- counted % s beans --' % num)  Time. sleep (3)  Print "end ..."  Return 'counted % s beans '% num     @ Huey. periodic_task (crontab (minute = '*/5 '))  Def every_five_mins ():  Print ('consumer prints this every 5 mins ')     @ Huey. task (retries = 3, retry_delay = 10)  Def try_thrice ():  If random. randint (1, 3) = 1:  Print ('OK ')  Else:  Print ('about to fail, will retry in 10 seconds ')  Raise Exception ('crap something went wrong ')     @ Huey. task ()  Def slow (n ):  Time. sleep (n)  Print ('slept % s' % n)  |  
  
 
  
 
 
 
 
 Run. sh 
 
 
  
   
   |  The code is as follows:  |  
       |  
  
 
   
    #! /Bin/bash  Echo "huey consumer"  Echo "-------------"  Echo "In another terminal, run 'Python main. Py '"  Echo "Stop the consumer using Ctrl + C"  PYTHONPATH =.: $ PYTHONPATH  Python.../huey/bin/huey_consumer.py main. huey -- threads = 2    =>  |  
  
 
  
 
 
 
 We can clone the huey code library first. There is a directory of examples. We can see that it supports django, but this is not the focus! 
 
 
  
   
   |  The code is as follows:  |  
       |  
  
 
   
    [Xiaorui @ devops/tmp] $ git clone https://github.com/coleifer/huey.git  Cloning into 'huine '...  Remote: Counting objects: 1423, done.  Remote: Compressing objects: 100% (9/9), done.  Grouping objects: 34% (497/1423), 388.00 KiB | 29.00 KiB/s     Grouping objects: 34% (498/1423), 628.00 KiB | 22.00 KiB/s        Remote: Total 1423 (delta 0), reused 0 (delta 0)  Grouping objects: 100% (1423/1423), 2.24 MiB | 29.00 KiB/s, done.  Resolving deltas: 100% (729/729), done.  Checking connectivity... done.  [Xiaorui @ devops/tmp] $ cd huey/examples/simple  [Xiaorui @ devops simple (master)] $ ll  Total 40  -Rw-r -- 1 xiaorui wheel 79B 9 8 README  -Rw-r -- 1 xiaorui wheel 0B 9 8 08:49 _ init _. py  -Rw-r -- 1 xiaorui wheel 56B 9 8 08:49 config. py  -Rwxr-xr-x 1 xiaorui wheel 227B 9 8 08:49 cons. sh  -Rw-r -- 1 xiaorui wheel 205B 9 8 08:49 main. py  -Rw-r -- 1 xiaorui wheel 607B 9 8 tasks. py  [Xiaorui @ devops simple (master)] $   |