Twisted - 这段代码应该在单独的线程中运行吗
我正在运行一些代码,有X个工作者,每个工作者每秒从一个队列中获取任务。为此,我使用了twisted库中的task.LoopingCall()
函数。每个工作者完成它的请求(抓取一些数据),然后把结果推送回另一个队列。所有这些操作都是在反应器线程中进行的,因为我没有把它们放到其他线程去处理。
我在想,是不是应该把这些工作放到不同的线程中去运行,还是就这样保持现状。如果要这样做的话,每个线程每秒调用一次task.LoopingCall
会不会有什么问题呢?
3 个回答
0
首先,要注意Twisted的反应器有时候会在后台使用多线程来分配任务,而你可能对此一无所知。当然,我并不知道你的程序具体是怎样的。
其次,在Python(也就是CPython)中,创建线程来进行非阻塞计算其实没什么好处。你可以了解一下全局解释器锁(GIL)的相关内容。
1
你不应该用线程来做这个。把所有操作都放在反应线程里是可以的。如果你在抓取数据时使用了 twisted.web.client
来进行网络访问,它不会造成阻塞,这样你就能尽可能快地进行抓取。
2
不,别用线程。你不能在一个线程里调用LoopingCall
(除非你用reactor.callFromThread
),但这也不会让你的代码运行得更快。
如果你发现性能有问题,可能需要先分析一下你的工作负载,找出哪些地方消耗了大量的CPU资源,然后把这些工作放到多个进程中去处理,使用spawnProcess
来创建这些进程。不过,你真的不能跳过找出哪些工作比较耗费资源这一步:没有什么神奇的办法能让你的Twisted应用变得更快。如果你选择的代码部分并不是特别耗资源,也不需要像CPU或磁盘这样的阻塞资源,那么你会发现把工作移到另一个进程的开销可能会超过你得到的任何好处。