回调(异步回调)在实际开发过程中的应用
来源:互联网 发布: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-----------------------------> ')
阅读全文
0 0
- 回调(异步回调)在实际开发过程中的应用
- 数据结构在实际开发过程中的应用
- 快速原型开发模式在实际开发过程中的应用
- 快速原型开发模式在实际开发过程中的应用
- UML在实际开发中的应用
- EL在实际开发中的应用举例
- MD5在实际开发中的应用方式
- Runtime在实际开发中的应用
- vector在实际多线程开发中的应用
- Java 反射在实际开发中的应用
- Java 反射在实际开发中的应用
- springBoot事件监听 在项目实际业务中的异步应用
- 浅谈实际开发中数据源在JDBC中的应用
- SCA技术在实际应用开发中的实践(1)-序
- 浅谈实际开发中数据源在JDBC中的应用
- 成员函数指针在开发中的实际应用
- Oracle 临时表在实际开发中的应用
- ssh框架视频教程在实际开发中的应用
- 进程的同步与通信,进程与线程同步的区别,进程与线程通信的区别
- Java开发中的23种设计模式详解----策略模式(strategy)
- 点滴RecyclerView
- 004 mediaplayer播放流程分析
- MailBee.NET Objects接收电子邮件(POP3)教程二:接收和显示HTML电子邮件
- 回调(异步回调)在实际开发过程中的应用
- leetcode-6 ZigZag Conversion
- redis操作总结
- JNDI Resources HOW-TO(Tomcat 9)
- 为项目重新设置git remote url
- var_dump输出格式
- Jquery如何获取子元素
- 即时通讯 的Java服务端开发
- [Sonatype Nexus]Nexus配置私有Maven库引入自定义jar包