python利用多线程让http请求异步返回
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python利用多线程让http请求异步返回,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4170字,纯文字阅读大概需要6分钟。
内容图文
有时我们可能会碰到这样一种情况,我们有一个功能,这个功能对外提供了一个http接口,我们需要对这个http接口发起请求才能启动这个服务,但是这个服务功能可能会执行很久,这样如果等功能执行结束再返回请求结果,那这个请求可能就超时了, ? 发起请求的客户端1 import requests 2 3 req = requests.get("http://127.0.0.1:9898/register?username=aaa&pwd=232323") 4 print(req.content)? 服务端
1 # coding=utf-8 2 import flask 3 from flask import jsonify 4 from flask import request 5 6 from gevent import pywsgi 7 8 import sys 9 reload(sys) 10 import time 11 sys.setdefaultencoding('utf-8') 12 13 server = flask.Flask(__name__) 14 15 @server.route('/register', methods=['get', 'post']) 16 def registerPost(): 17 # post请求获取请求的参数,返回结果类型是str 18 username = request.values.get('username') 19 pwd = request.values.get('pwd') 20 app_id = request.values.get('app_id') 21 dowork(app_id) 22 # confirmpwd = request.values.get('confirmpwd') 23 if username and pwd: # 判断输入的用户名、密码、确认密码都不为空 24 return ("用户名为:%s, 密码为:%s" % (username, pwd)) 25 else: 26 return jsonify({"code": 504, "msg": "必填项不能为空"}) 27 28 29 if __name__ == '__main__': 30 # port可以指定端口,默认端口是5000 31 # host默认是127.0.0.1,写成0.0.0.0的话,其他人可以访问,代表监听多块网卡上面, 32 # server.run(debug=True, port=9898, host='0.0.0.0') 33 server = pywsgi.WSGIServer(('0.0.0.0', 9898), server) 34 server.serve_forever()这个就是一个典型的同步返回结果,发起请求后,必须等 dowork() 功能执行完之后才能返回请求结果,如果 dowork() 执行时间较长,则会导致客户端请求超时 ? 这时我们可能就需要一个异步的http接口,收到客户端的请求后,马上返回一个请求结果,然后再慢慢的执行要执行的任务,这个过程怎么实现呢,我的做法是通过多线程来实现,在服务端的响应函数中,每次收到一个请求,获取请求中携带的参数,然后用这些参数创建一个会执行我们功能服务的线程,最后返回请求结果,这样客户端可以很快获取到请求结果,从而不会让客户端请求超时 ? 下面是加入了线程的服务端的响应函数
1 # coding=utf-8 2 import flask 3 from flask import jsonify 4 from flask import request 5 6 from gevent import pywsgi 7 8 import sys 9 reload(sys) 10 import time 11 sys.setdefaultencoding('utf-8') 12 13 server = flask.Flask(__name__) 14 15 import threading 16 import time 17 18 exitFlag = 0 19 20 class myThread (threading.Thread): 21 def __init__(self, threadID, name, counter, app_id): 22 threading.Thread.__init__(self) 23 self.threadID = threadID 24 self.name = name 25 self.counter = counter 26 self.app_id = app_id 27 def run(self): 28 print ("开始线程:" + self.name) 29 print_time(self.name, self.counter, 1, self.app_id) 30 print ("退出线程:" + self.name) 31 32 def print_time(threadName, delay, counter, app_id): 33 while counter: 34 if exitFlag: 35 threadName.exit() 36 time.sleep(delay) 37 print ("%s: %s" % (threadName, time.ctime(time.time()))) 38 dowork(app_id) 39 counter -= 1 40 41 @server.route('/register', methods=['get', 'post']) 42 def registerPost(): 43 # post请求获取请求的参数,返回结果类型是str 44 username = request.values.get('username') 45 pwd = request.values.get('pwd') 46 app_id = request.values.get('app_id') 47 48 # 创建新线程 49 thread1 = myThread(1, "Thread-1", 1, app_id) 50 # 开启新线程 51 thread1.start() 52 53 # confirmpwd = request.values.get('confirmpwd') 54 if username and pwd: # 判断输入的用户名、密码、确认密码都不为空 55 return ("用户名为:%s, 密码为:%s" % (username, pwd)) 56 else: 57 return jsonify({"code": 504, "msg": "必填项不能为空"}) 58 59 60 if __name__ == '__main__': 61 # port可以指定端口,默认端口是5000 62 # host默认是127.0.0.1,写成0.0.0.0的话,其他人可以访问,代表监听多块网卡上面, 63 # server.run(debug=True, port=9898, host='0.0.0.0') 64 server = pywsgi.WSGIServer(('0.0.0.0', 9898), server) 65 server.serve_forever()
?
因为线程的run()方法和start()方法是不能传递参数的,所以如果我们需要从请求中获取参数然后传递给要执行的功能的话,可以在线程的构造方法的参数中加上我们需要传递的参数,这样在run()方法内部我们就能动态获得请求中传递的参数了
?
内容总结
以上是互联网集市为您收集整理的python利用多线程让http请求异步返回全部内容,希望文章能够帮你解决python利用多线程让http请求异步返回所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。