回调(异步回调)在实际开发过程中的应用

来源:互联网 发布:aloha软件 编辑:程序博客网 时间:2024/06/11 04:39

https://www.zhihu.com/question/19801131

http://blog.csdn.net/payinglee/article/details/9005010

回调:

import timeimport threadingclass SomeOneInterface(object):    def do_home_work(self, question_str, answer_str):        raise NotImplementedErrorclass Student(SomeOneInterface):    def __init__(self):        super(Student, self).__init__()    def do_home_work(self, question_str):        if question_str == '1+1=?':            answer_str = "2"            return answer_str        else:            answer_str = "no known"            return answer_str    def ask(self, question_str, tool):        result = None        def create_thread():            result = tool.get_answer(question_str, self)            return result        # result = tool.get_answer(question_str, self)  # 同步阻塞        threading.Thread(target=create_thread).start()        self.go_home()        return result    def go_home(self):        print("\n我要回家了!######################## go home")class Doctor(SomeOneInterface):    def __init__(self):        super(Doctor, self).__init__()    def do_home_work(self, question_str):        if question_str == "感冒了,吃什么药?":            answer_str = "吃感康"            return answer_str        else:            answer_str = "no known"            return answer_strclass SolveQuestionTool(object):    def __init__(self):        pass    def get_answer(self, question_str, some_one):        if question_str == '1+1=?':            print('main thread  block.... ')            time.sleep(3)        return some_one.do_home_work(question_str)if __name__ == '__main__':    print('main thread  running ')    student = Student()    question_str = '1+1=?'    print('result=%s' % student.ask(question_str, SolveQuestionTool()))    print('----------------------------->')
再看一个例子:
testServer.py
# coding:utf-8import socketimport  timedef main():    server_socket = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)    server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)    server_socket.bind(("127.0.0.1", 3316))    server_socket.listen(5)    buffer_size = 1024    print('Serving HTTP On Port 3316')    while True:        print('waiting for connecting ....')        client_socket, client_addr_info = server_socket.accept()        # print('connecting from %s' % client_addr_info)        print 'connecting from ', client_addr_info        while True:            try:                client_data = client_socket.recv(buffer_size)                if not client_data:                    break                print('receive data =%s from client ' % client_data)                i = client_data.find('[')                j = client_data.find(']')                if i != -1 and j != -1:                    sFunId = client_data[i+1:j]                    message = client_data[j+1:]                    time.sleep(2)                    send_to_listener("[%s] echo" % sFunId)            except Exception as msg:                print('Exception message=%s' % msg)                break        # server_response = """        # HTTP/1.1 200 OK        #        # Hello , world"""        #        # client_socket.sendall(server_response)        client_socket.close()    server_socket.close()def send_to_listener(message):    listener_socket = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)    listener_socket.connect(("127.0.0.1", 7800))    listener_socket.sendall(message)    listener_socket.close()    print("send to listener message =%s" % message)main()
testClient.py
# # coding:utf-8import threadingimport timefrom socket import *lCallback = {}iFuncId = 0def StartListener():    global iFuncId    global lCallback    HOST = "127.0.0.1"    PORT = 7800    BUFSIZE = 1024    ADDR = (HOST, PORT)    tcpSerSock = socket(AF_INET, SOCK_STREAM)    tcpSerSock.bind(ADDR)    tcpSerSock.listen(5)    print "Listener bind port %d ,starting ...." % PORT    while 1:        print 'waiting for connection ...'        tcpCliSock, addr = tcpSerSock.accept()        print '...connected from:',addr        while 1:            try:                data = tcpCliSock.recv(BUFSIZE)                if not data:                    break                print 'data = %s' % data                i = data.find('[')                j = data.find(']')                if i!=-1 and j!=-1:                    iFuncId = int(data[i+1:j])                    message = data[j+1:]                    func = lCallback.get(iFuncId,None)                    if func:                        func()                        del lCallback[iFuncId]            except Exception as e:                print e                break        tcpCliSock.close()    tcpSerSock.close()def MyCallback():    print 'callback called !!!!!!!!!!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@'def Send(callback,message):    global iFuncId    global lCallback    lCallback[iFuncId] = callback    listenerSock = socket(AF_INET, SOCK_STREAM)    listenerSock.connect(('127.0.0.1',3316))    listenerSock.send("[%d] %s" % (iFuncId,message))    listenerSock.close()    iFuncId += 1    print 'send message to YoSQL : %s'%messagedef DoSomeThing(index):    print '......Main Thread DoSomeThing......', indexif __name__ == '__main__':    t = threading.Thread(target=StartListener)    t.setDaemon(True)    t.start()    # t.join()    DoSomeThing(1)    DoSomeThing(2)    Send(MyCallback,"hahaha")    i = 0    while i < 20:        DoSomeThing(3+i)        i += 1        # if i== 10:        #     time.sleep(1)        try:            time.sleep(0.5)        except Exception, e:            print e            break    # t.join(2)    DoSomeThing('end')    print '>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>'
加入了事件通知的的异步回调:
# coding:utf-8import timeimport threadingclass SomeOneInterface(object):    def do_home_work(self, question_str, answer_str):        raise NotImplementedErrorclass Student(SomeOneInterface):    def __init__(self):        super(Student, self).__init__()    def do_home_work(self, question_str):        if question_str == '1+1=?':            answer_str = "2"            return answer_str        else:            answer_str = "no known"            return answer_str    def ask(self, question_str, tool):        result = None        def create_thread():            result = tool.get_answer(question_str, self)            return result        # result = tool.get_answer(question_str, self)  # 同步主线程 阻塞        threading.Thread(target=create_thread).start()        self.go_home()        return result    def asyn_callback(self):        print("\n 有事件通知的回调 学生的异步回调-------------> 没有阻塞主线程")    def go_home(self):        print("\n 没有事件通知的回调,我要回家了!######################## go home")class Doctor(SomeOneInterface):    def __init__(self):        super(Doctor, self).__init__()    def do_home_work(self, question_str):        if question_str == "感冒了,吃什么药?":            answer_str = "吃感康"            return answer_str        else:            answer_str = "no known"            return answer_strclass SolveQuestionTool(object):    def __init__(self):        pass    def get_answer(self, question_str, some_one):        if question_str == '1+1=?':            if isinstance(some_one, Student):               Event.register_ev_status('student_event', some_one.asyn_callback)            print('\n 模拟阻塞主线程3秒, 使用了异步就不会阻塞掉主线程 main thread  block.... ')            block = 1            while block <= 3:                try:                    if 3 < block:                        break                    print('模拟阻塞 %s  ......wait for ......................' % block)                    block += 1                    time.sleep(1)                except Exception as e:                    print ('Exception=%s' %e)            time.sleep(3)  # 模拟阻塞主线程3秒, 使用了异步就不会阻塞掉主线程        return some_one.do_home_work(question_str)class Event(object):    event_name_to_func = {}   # 事件 -->相应的处理函数的映射    def __init__(self):        pass    @classmethod    def register_ev_status(cls, ev_name, func):        cls.event_name_to_func.setdefault(ev_name, func)def event_loop(event):    while 1:        for ev_name, func in event.event_name_to_func.items():            if func:                func()                returnif __name__ == '__main__':    print('主线程 main thread  running 111111-----------------------------> ')    student = Student()    event = Event()    threading.Thread(target=event_loop, args=(event,)).start()    question_str = '1+1=?'    print('主线程 main thread  running 22222-----------------------------> ')    print('result=%s' % student.ask(question_str, SolveQuestionTool()))    print('主线程 main thread  running 33333333-----------------------------> ')    print('没有阻塞主线程 ')    print('主线程已经运行完了 main thread  running    end-----------------------------> ')



原创粉丝点击