63 lines
1.3 KiB
Python
63 lines
1.3 KiB
Python
#!/usr/bin/env python
|
|
# -*- encoding: utf-8 -*-
|
|
"""
|
|
Topic: 带状态值的回调函数
|
|
Desc :
|
|
"""
|
|
|
|
|
|
def apply_async(func, args, *, callback):
|
|
# Compute the result
|
|
result = func(*args)
|
|
|
|
# Invoke the callback with the result
|
|
callback(result)
|
|
|
|
|
|
def add(x, y):
|
|
return x + y
|
|
|
|
|
|
# 类方案
|
|
class ResultHandler:
|
|
|
|
def __init__(self):
|
|
self.sequence = 0
|
|
|
|
def handler(self, result):
|
|
self.sequence += 1
|
|
print('[{}] Got: {}'.format(self.sequence, result))
|
|
|
|
r = ResultHandler()
|
|
apply_async(add, (2, 3), callback=r.handler)
|
|
apply_async(add, ('hello', 'world'), callback=r.handler)
|
|
|
|
|
|
# 闭包方案
|
|
def make_handler():
|
|
sequence = 0
|
|
def handler(result):
|
|
nonlocal sequence
|
|
sequence += 1
|
|
print('[{}] Got: {}'.format(sequence, result))
|
|
return handler
|
|
|
|
handler = make_handler()
|
|
apply_async(add, (2, 3), callback=handler)
|
|
apply_async(add, ('hello', 'world'), callback=handler)
|
|
|
|
|
|
# 协程方案
|
|
def make_handler():
|
|
sequence = 0
|
|
while True:
|
|
result = yield
|
|
sequence += 1
|
|
print('[{}] Got: {}'.format(sequence, result))
|
|
|
|
handler = make_handler()
|
|
next(handler) # Advance to the yield
|
|
apply_async(add, (2, 3), callback=handler.send)
|
|
apply_async(add, ('hello', 'world'), callback=handler.send)
|
|
|