我正在运行一些具有X worker的代码,每个worker每秒从队列中提取任务。为此,我使用twisted task.LoopingCall()
函数。每个工作人员完成其请求(刮掉一些数据),然后将响应推送回另一个队列。所有这些都是在reactor线程中完成的,因为我没有将它推迟到任何其他线程。
我想知道我是否应该在单独的线程中运行所有这些作业,或者保持原样。如果是这样,如果我从每个线程每秒调用task.LoopingCall
会有问题吗?
答案 0 :(得分:2)
不,你不应该使用线程。你无法从一个帖子中调用LoopingCall
(除非你使用reactor.callFromThread
),但它不会帮助你加快代码的使用。
如果您发现性能问题,可能需要对工作负载进行概要分析,找出CPU密集型工作的位置,然后将该工作放入多个进程中,并使用{{1}生成}。你真的不能跳过你弄清楚昂贵的工作在哪里的步骤,但是你可以在你的Twisted应用程序上撒上没有神奇的小精灵粉尘,这会让它变得更快。如果您选择的代码部分不是非常密集且不需要阻止CPU或磁盘等资源,那么您会发现将工作转移到不同进程的开销可能会超过将其放在那里的任何好处。 / p>
答案 1 :(得分:1)
你不应该使用线程。在反应堆线程中完成所有操作是可以的。如果您的抓取使用twisted.web.client
进行网络访问,则不应该阻止,因此您将尽可能快地进行抓取。
答案 2 :(得分:0)
首先,请注意Twisted的反应堆有时会多线程并分配任务而不会告诉您任何事情。当然,我没有特别看过你的节目。
其次,在Python中(即在CPython中)产生线程来进行非阻塞计算几乎没有什么好处。阅读GIL (Global Interpreter Lock)。