Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5104359
  • 博文数量: 921
  • 博客积分: 16037
  • 博客等级: 上将
  • 技术积分: 8469
  • 用 户 组: 普通用户
  • 注册时间: 2006-04-05 02:08
文章分类

全部博文(921)

文章存档

2020年(1)

2019年(3)

2018年(3)

2017年(6)

2016年(47)

2015年(72)

2014年(25)

2013年(72)

2012年(125)

2011年(182)

2010年(42)

2009年(14)

2008年(85)

2007年(89)

2006年(155)

分类: Python/Ruby

2013-11-11 17:11:53

很多场景,都需要异步回调机制。下面一个简单的例子。


  1. #!/usr/bin/env python
  2. # -*- coding: UTF-8 -*-

  3. import logging
  4. import queue
  5. import threading

  6. def func_a(a, b):
  7.     return a + b

  8. def func_b():
  9.     pass

  10. def func_c(a, b, c):
  11.     return a, b, c

  12. # 异步任务队列
  13. _task_queue = queue.Queue()

  14. def async_call(function, callback, *args, **kwargs):
  15.     _task_queue.put({
  16.         'function': function,
  17.         'callback': callback,
  18.         'args': args,
  19.         'kwargs': kwargs
  20.     })

  21. def _task_queue_consumer():
  22.     """
  23.     异步任务队列消费者
  24.     """
  25.     while True:
  26.         try:
  27.             task = _task_queue.get()
  28.             function = task.get('function')
  29.             callback = task.get('callback')
  30.             args = task.get('args')
  31.             kwargs = task.get('kwargs')
  32.             try:
  33.                 if callback:
  34.                     callback(function(*args, **kwargs))
  35.             except Exception as ex:
  36.                 if callback:
  37.                     callback(ex)
  38.             finally:
  39.                 _task_queue.task_done()
  40.         except Exception as ex:
  41.             logging.warning(ex)

  42. def handle_result(result):
  43.     print(type(result), result)

  44. if __name__ == '__main__':
  45.     t = threading.Thread(target=_task_queue_consumer)
  46.     t.daemon = True
  47.     t.start()

  48.     async_call(func_a, handle_result, 1, 2)
  49.     async_call(func_b, handle_result)
  50.     async_call(func_c, handle_result, 1, 2, 3)
  51.     async_call(func_c, handle_result, 1, 2, 3, 4)

  52.     _task_queue.join()

阅读(3343) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~