• tornado 并发性测试


    server.py

    1. import time
    2. import tornado.web
    3. import tornado.gen
    4. import tornado.ioloop
    5. from tornado import httpserver
    6. from tornado.concurrent import run_on_executor
    7. from concurrent.futures import ThreadPoolExecutor
    8. class SyncHandler(tornado.web.RequestHandler):
    9. def get(self, *args, **kwargs):
    10. print("begin sync.")
    11. time.sleep(5)
    12. self.write("sync handler, hello.")
    13. class AsyncHandler(tornado.web.RequestHandler):
    14. executor = ThreadPoolExecutor(5)
    15. @tornado.gen.coroutine
    16. def get(self):
    17. print("begin async.")
    18. result = yield self.core_process()
    19. self.write(result)
    20. @run_on_executor()
    21. def core_process(self):
    22. time.sleep(5)
    23. return 'asyn handler, hello.'
    24. class Application(tornado.web.Application):
    25. def __init__(self):
    26. handlers = [
    27. (r'/sync', SyncHandler),
    28. (r'/async', AsyncHandler)
    29. ]
    30. settings = dict(
    31. debug=True,
    32. template_path="templates",
    33. static_path="static"
    34. )
    35. super(Application, self).__init__(handlers, **settings)
    36. application = Application()
    37. if __name__ == "__main__":
    38. http_server = httpserver.HTTPServer(application)
    39. http_server.listen(10002)
    40. http_server.start(1) #启动进程数,window下只能是1
    41. tornado.ioloop.IOLoop.instance().start()

    client.py

    使用tomorrow模拟多线程并发访问

    1. import requests
    2. import time
    3. from tomorrow import threads
    4. @threads(10)
    5. def sync_test():
    6. payload = {}
    7. headers = {}
    8. response = requests.request("GET", 'http://127.0.0.1:10002/sync', headers=headers, data=payload)
    9. print(response.text + ' ' + time.strftime('%H:%M:%S'))
    10. @threads(10)
    11. def async_test():
    12. payload = {}
    13. headers = {}
    14. response = requests.request("GET", 'http://10.1.15.24:10002/async', headers=headers, data=payload)
    15. print(response.text + ' ' + time.strftime('%H:%M:%S'))
    16. [sync_test() for i in range(100)]
    17. # [async_test() for i in range(50)]

    同步输出结果,每5s只能处理一个请求

     

    看以看到,10线程请求同步接口时候,是每隔5秒才能领处理完成一个请求。程序中设置的tornado进程是1,如果把tornado服务的进程数量提高为4,每5秒也能处理4个同步请求。

    异步处理输出结果:

    看以看到,10线程请求异步接口时候,是每隔5秒能处理5个请求,因为代码中设置的ThreadPoolExecutor(5)数量是5。如果设置为8,那么每5秒可以处理8个请求。

    问题:对于异步处理和同步处理,同一个时间段发起的10个线程请求剩下的5个线程请求在下一个5秒是接着处理,还是丢弃了?

     

  • 相关阅读:
    详解小程序配置服务器域名
    Keras学习记录之模型编译-训练-评估-预测
    Spring Boot整合Zookeeper实现分布式锁
    ChatGPT:好家伙,每个人内心的一块魔镜
    Spring源码阅读-ClassPathXmlApplicationContext
    Springboot+基于微信小程序的商城 毕业设计-附源码191145
    【二叉树】最长同值路径
    Unity引擎制作玻璃的反射和折射效果
    JavaWeb篇_11——HttpServletResponse对象
    【LeetCode-中等题】210. 课程表 II
  • 原文地址:https://blog.csdn.net/wzw12315/article/details/126530417