回调函数 call_back

落爺英雄遲暮 提交于 2019-12-04 21:39:29
"""call_back 回调函数就是(我给你电话,你忙完你的,按照号码打回来)
obj.add_done_callback(func)对象.打电话给我(留的联系方式)


回调函数:
    把函数当成参数传递给另外一个函数
    在当前函数执行完毕之后,调用一下传递进来的函数,该函数是回调函数
"""
from concurrent.futures import ThreadPoolExecutor
from threading import currentThread as cthread
import time,os
# (1) 线程池,它的回调函数 由子线程完成

"""
(1)add_done_callback 在获取当前线程的返回值的时候,可以异步并发,加快速度
(2)回调函数由谁执行:由执行任务的当前子线程,调用回调函数
"""
lst = []
def func(i):
    print("thread",i,cthread().ident)
    time.sleep(0.1)
    print("thread %s end" % (i))
    return "*" * i

# 回调函数
def call_back(obj):
    print("<==start==>")
    print("call_back:",cthread().ident)
    print(obj)
    print(obj.result())
    print("<==end==>")

tp = ThreadPoolExecutor(5)
for i in range(1,11):
    obj = tp.submit(func,i)
    # 使用回调函数,异步并发
    obj.add_done_callback(call_back)
    # print(obj)
    # lst.append(obj)


# 打印返回值
for i in lst:
    print(i.result())
# print("主线程执行结束.. end",cthread().ident)

# 代码解析:
class MyClass():
    def add_done_callback(self,func):
        # code1 code2 code3....
        """
        self <==> obj
        func <==> call_back
        """
        # 最后func
        func(self)

def call_back(args):
    # args <==> obj
    print("call_back:",cthread().ident)
    print(args)
    print(args.result())
obj = MyClass()
obj.add_done_callback(call_back)






# (2) 进程池,它的回调函数 由主进程完成
"""
(1)add_done_callback 在获取当前进程的返回值的时候,可以异步并发,加快速度
(2)回调函数由谁执行:都由主进程来完成
"""
from concurrent.futures import ProcessPoolExecutor
def func(i):
    print("Process",i,os.getpid())
    time.sleep(0.1)
    print("Process %s end" % (i))
    return "*" * i

def call_back(obj):
    print("call_back:",os.getpid())
    print(obj.result())

if __name__ == "__main__":
    p = ProcessPoolExecutor(5)
    for i in range(1,11):
        obj = p.submit(func,i)
        # print(obj.result())
        obj.add_done_callback(call_back)

    print("主进程执行结束.." , os.getpid())

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!