Python Celery 与线程库在异步请求中的对比
我正在运行一个Python方法,它需要处理很多数据。因为这个过程比较耗时,所以我想在一个单独的线程上异步运行它,这样用户就可以继续访问网站或界面。
使用“from threading import thread”这个模块创建的线程,如果用户退出网站,会自动结束吗?还是说它们会继续在服务器上运行?
使用Celery和单纯使用线程模块相比,有什么好处呢?
1 个回答
26
Python的解释器是单线程的,这主要是因为一个叫做全局解释器锁(GIL)的东西。简单来说,这个锁让Python在同一时间只能做一件事情,所以在Python中,线程只有在计算和输入输出(IO)可以同时进行时,才能真正实现并行处理。对于那些需要大量计算的任务,使用Python的线程模型几乎没有什么好处,特别是在CPython 2或3的环境下。
不过,这些限制对多进程(multiprocessing)就不适用了,这正是你在使用像celery这样的队列系统时要做的事情。你可以在多核机器上同时运行多个Python工作实例,或者在多台机器上同时运行。
如果我理解你的情况没错的话——在网站上进行某个操作后会启动一个长时间运行的任务——那么使用队列几乎肯定是最佳选择。这样你就能实现真正的并行处理,并且可以轻松地把处理任务转移到其他机器上。