Django在使用线程时请求-响应性能较差

2024-04-20 03:57:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图优化特定端点上的响应时间,所以我尝试使用普通线程来实现并行。问题是性能似乎没有提高,实际上从视图中删除线程给了我一半的时间,而实际上它应该并行运行

以下是一些例子:

def myView():
    do_a()
    return Response("ok")

def myView():
    do_a()
    thread = Thread(target=do_b)
    thread.start()
    return Response("ok")

没有线程的myView需要30毫秒,而应该并行运行do_b的线程的视图实际需要60毫秒

在使用do_b线程(使用djongo接口)时,我使用了django、django restframework和mongodb

我这里有什么问题


Tags: django视图returnresponsedef时间ok性能
1条回答
网友
1楼 · 发布于 2024-04-20 03:57:22

实际上,do_b()函数正在等待do_a()函数完成。因此没有性能增益。这是因为do_a()函数不是线程。如果在do_a()函数之前调用do_b()函数,则可能会有差异。如果您认为do_b()需要在不等待do_a的情况下运行,则可以在线程中添加这两个选项

这是您当前的场景:

import logging
import threading
import time


def do_a():
    logging.info("Function do_a starting")
    time.sleep(2)
    logging.info("Function do_a finishing")
    
    
def do_b():
    logging.info("Function do_b starting")
    time.sleep(2)
    logging.info("Function do_b finishing")

if __name__ == "__main__":
    format = "%(asctime)s: %(message)s"
    logging.basicConfig(format=format, level=logging.INFO,
                        datefmt="%H:%M:%S")
                        
    logging.info("Main    : before calling do_a")
    do_a()
    logging.info("Main    : after calling do_a")

    logging.info("Main    : before creating thread 2")
    x = threading.Thread(target=do_b)
    logging.info("Main    : before running thread 2")
    x.start()
    logging.info("Main    : wait for the thread to finish")
    x.join()
    logging.info("Main    : all done")

输出将持续4秒:

03:23:11: Main    : before calling do_a
03:23:11: Function do_a starting
03:23:13: Function do_a finishing
03:23:13: Main    : after calling do_a
03:23:13: Main    : before creating thread 2
03:23:13: Main    : before running thread 2
03:23:13: Function do_b starting
03:23:13: Main    : wait for the thread to finish
03:23:15: Function do_b finishing
03:23:15: Main    : all done

但是如果你也在线程中添加了一个

import logging
import threading
import time


def do_a():
    logging.info("Function do_a starting")
    time.sleep(2)
    logging.info("Function do_a finishing")
    
    
def do_b():
    logging.info("Function do_b starting")
    time.sleep(2)
    logging.info("Function do_b finishing")

if __name__ == "__main__":
    format = "%(asctime)s: %(message)s"
    logging.basicConfig(format=format, level=logging.INFO,
                        datefmt="%H:%M:%S")
                        
    logging.info("Main    : before creating thread 1")
    x = threading.Thread(target=do_a)
    logging.info("Main    : before running thread 1")

    logging.info("Main    : before creating thread 2")
    x = threading.Thread(target=do_b)
    logging.info("Main    : before running thread 2")
    x.start()
    logging.info("Main    : wait for the thread to finish")
    x.join()
    logging.info("Main    : all done")

输出可在2秒内完成:

03:25:43: Main    : before creating thread 1
03:25:43: Main    : before running thread 1
03:25:43: Main    : before creating thread 2
03:25:43: Main    : before running thread 2
03:25:43: Function do_b starting
03:25:43: Main    : wait for the thread to finish
03:25:45: Function do_b finishing
03:25:45: Main    : all done

相关问题 更多 >