44 lines
1.2 KiB
Python
44 lines
1.2 KiB
Python
def apply_async(func, args, *, callback):
|
|
result = func(*args)
|
|
callback(result)
|
|
|
|
def print_result(result):
|
|
print(result)
|
|
|
|
def add(x, y):
|
|
return x + y
|
|
|
|
# 如果只是简单的调用回调函数,那直接用就可以了
|
|
apply_async(add, (1, 2), callback=print_result)
|
|
apply_async(add, ('hello', 'world'), callback=print_result)
|
|
|
|
# 但是,如果我想要知道这个函数被调用了几次,携带这些保存的信息返回,可以这样改写:
|
|
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, (1, 2), callback=handler)
|
|
apply_async(add, (1, 2), callback=handler)
|
|
|
|
|
|
# 当然我们也能用协程去搞定它:
|
|
# 协程的复习在10.1中,单步调试你就看懂了
|
|
def make_handler_v2():
|
|
sequence = 0
|
|
while True:
|
|
result = yield
|
|
sequence += 1
|
|
print('[{}] Got: {}'.format(sequence, result))
|
|
handler = make_handler_v2()
|
|
next(handler)
|
|
apply_async(add, (1, 2), callback=handler.send)
|
|
apply_async(add, (1, 2), callback=handler.send)
|
|
apply_async(add, (1, 2), callback=handler.send)
|
|
|
|
|
|
|