python 异步http请求_python利用多线程让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_id27 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()方法内部我们就能动态获得请求中传递的参数了

标签:__,http,请求,python,0.0,app,server,import,多线程

来源: https://www.cnblogs.com/hi3254014978/p/13622113.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值