理解pythongil-I/O绑定与CPU绑定
从文件 在CPython中,由于全局解释器锁,只有一个线程可以 立即执行Python代码(即使某些面向性能 库可能会克服此限制)。如果你想要你的 应用程序以更好地利用 多核机器,建议您使用多处理。然而, 如果要运行多个线程,线程仍然是合适的模型 同时执行I/O绑定任务 现在我有一个像这样的线程工人理解pythongil-I/O绑定与CPU绑定,python,multithreading,gil,Python,Multithreading,Gil,从文件 在CPython中,由于全局解释器锁,只有一个线程可以 立即执行Python代码(即使某些面向性能 库可能会克服此限制)。如果你想要你的 应用程序以更好地利用 多核机器,建议您使用多处理。然而, 如果要运行多个线程,线程仍然是合适的模型 同时执行I/O绑定任务 现在我有一个像这样的线程工人 def worker(queue): queue_full = True while queue_full: try: url = queue.
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()
做两件事
请求
库刮取urlpyv8
javascript库分析刮取的html1
是I/O绑定,2
是CPU绑定
这是否意味着,GIL申请了
2
,而我的程序无法正常运行?对GIL
的描述没有说明任何正确性,只说明了效率
如果2
受CPU限制,您将无法从线程中获得多核性能,但您的程序仍将正确执行
如果您关心CPU并行性,那么应该使用Python的
多处理库。我会在这里检查一个假设。我认为请求
受CPU限制,或者至少它会锁定线程,直到请求完成。对于具有回调功能的库,我会签出。这是错误的<代码>请求(以及urllib
,httplib2
等)都是非常受I/O限制的<代码>线程化
加快了所有线程的速度。@Huu仅仅因为有东西锁定了线程并不意味着它是CPU受限的。如果将sleep(1000)
放入一个线程,该线程将被阻塞一段时间,但它不会做任何工作,并将在其间释放GIL。任何其他类型的IO请求也是如此。