【发布时间】:2014-05-09 21:37:17
【问题描述】:
来自python threading 文档
在 CPython 中,由于全局解释器锁,只有一个线程可以 立即执行 Python 代码(即使某些面向性能的 图书馆可能会克服这个限制)。如果你想要你的 应用程序以更好地利用计算资源 多核机器,建议使用多处理。然而, 如果你想运行多个线程仍然是一个合适的模型 I/O 密集型任务同时进行。
现在我有一个像这样的线程工作者
def worker(queue):
queue_full = True
while queue_full:
try:
url = queue.get(False)
w = Wappalyzer(url)
w.analyze()
queue.task_done()
except Queue.Empty:
queue_full = False
这里w.analyze()做两件事
- 使用
requests库抓取网址 - 使用
pyv8javascript库分析抓取的html
据我所知,1 受 I/O 限制,2 受 CPU 限制。
是不是说,GIL 申请了2,我的程序就不能正常运行了?
【问题讨论】:
-
我会在这里检查一个假设。我认为
requests受 CPU 限制,或者至少它会锁定其线程,直到请求完成。对于支持回调的库,我会查看requests-futures。 -
这是不正确的。
requests(和urllib、httplib2等)都非常受 I/O 限制。threading加快所有速度。 -
@Huu 仅仅因为某些东西锁定了线程并不意味着它受 CPU 限制。如果您将
sleep(1000)放入线程中,该线程将被阻塞一段时间,但它不会做任何工作,并且会在其间释放 GIL。任何其他类型的 IO 请求也是如此。
标签: python multithreading gil