| 注册
请输入搜索内容

热门搜索

Java Linux MySQL PHP JavaScript Hibernate jQuery Nginx
ex7n
10年前发布

Python异步任务队列

很多场景为了不阻塞,都需要异步回调机制。这是一个简单的例子。

#!/usr/bin/env python  # -*- coding: UTF-8 -*-    import logging  import queue  import threading    def func_a(a, b):      return a + b    def func_b():      pass    def func_c(a, b, c):      return a, b, c    # 异步任务队列  _task_queue = queue.Queue()    def async_call(function, callback, *args, **kwargs):      _task_queue.put({          'function': function,          'callback': callback,          'args': args,          'kwargs': kwargs      })    def _task_queue_consumer():      """      异步任务队列消费者      """      while True:          try:              task = _task_queue.get()              function = task.get('function')              callback = task.get('callback')              args = task.get('args')              kwargs = task.get('kwargs')              try:                  if callback:                      callback(function(*args, **kwargs))              except Exception as ex:                  if callback:                      callback(ex)              finally:                  _task_queue.task_done()          except Exception as ex:              logging.warning(ex)    def handle_result(result):      print(type(result), result)    if __name__ == '__main__':      t = threading.Thread(target=_task_queue_consumer)      t.daemon = True      t.start()        async_call(func_a, handle_result, 1, 2)      async_call(func_b, handle_result)      async_call(func_c, handle_result, 1, 2, 3)      async_call(func_c, handle_result, 1, 2, 3, 4)        _task_queue.join()